您的位置:首页 > Web前端 > JavaScript

JS基础知识(2)-原型

2018-08-06 17:21 204 查看

每个函数都有 prototype 属性,除了 Function.prototype.bind(),该属性指向 原型。 

每个对象都有 __proto__ 属性,指向了创建该对象的构造函数的原型。其实这个 属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到, 所以使用 _proto_ 来访问。 对象可以通过 __proto__ 来寻找不属于该对象的属性,__proto__ 将对象连接起 来组成了原型链。 

一个对象除了自身的显示属性外还隐含一个_proto_属性,这个属性指向创建该对象的构造函数的原型。

如:

[code]let foo={ //内部也是使用了 new Object()
x: 10,
y: 20
}

假设拥有两个对象,它们之间只有一小部分不同,其他部分都相同。显然,我们将会重用相似的功能/代码,如下calculate函数以及变量x为对b,c公用,则可以

[code]var a = {
x: 10,
calculate: function (z) {
return this.x + this.y + z
}

};

var b = {
y: 20,
__proto__: a
};

var c = {
y: 30,
__proto__: a
};

通过构造函数来实现相同部分,也就是用构造函数来代替上述a的功能

[code]
function Foo(y) { // function 就是个语法糖 内部等同于 new Function()

this.y = y;
}

Foo.prototype.x = 10;

Foo.prototype.calculate = function (z) {
return this.x + this.y + z;
};

var b = new Foo(20);
var c = new Foo(30);

代码关系如下图: 

 

每个对象都有一个原型。构造函数Foo也有自己的__proto__,值为Function.prototypeFunction.prototype也通过其__proto__属性关联到Object.prototype

对象可以通过 __proto__ 来寻找不属于该对象的属性,__proto__ 将对象连接起 来组成了原型链。 

在ES6中有了类:

[code]class Foo {
constructor(name) {
this._name = name;
}
getName() {
return this._name;
}
}

class Bar extends Foo {
getName() {
return super.getName() + ' Doe';
}
}

var bar = new Bar('John');
console.log(bar.getName()); // John Doe

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: