每个函数都有 prototype 属性,除了 Function.prototype.bind(),该属性指向 原型。
每个对象都有 __proto__ 属性,指向了创建该对象的构造函数的原型。其实这个 属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到, 所以使用 _proto_ 来访问。 对象可以通过 __proto__ 来寻找不属于该对象的属性,__proto__ 将对象连接起 来组成了原型链。
一个对象除了自身的显示属性外还隐含一个_proto_属性,这个属性指向创建该对象的构造函数的原型。
如:
let foo={ //内部也是使用了 new Object()
x: 10,
y: 20
}
假设拥有两个对象,它们之间只有一小部分不同,其他部分都相同。显然,我们将会重用相似的功能/代码,如下calculate函数以及变量x为对b,c公用,则可以
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的功能
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.prototype,Function.prototype也通过其__proto__属性关联到Object.prototype。
对象可以通过 __proto__ 来寻找不属于该对象的属性,__proto__ 将对象连接起 来组成了原型链。
在ES6中有了类:
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