https://github.com/luoway/luoway.github.io/blob/master/_posts/2015-10-14-prototype-inherit-Object.md
prototype 只是一个纯粹的习惯性的属性名
原型是 JavaScript 一种对象引用的方法,不同于把 A 赋给 B ,两个变量引用一个对象。而是,
给 B 添加一个通常命名为“ prototype ”的属性,它是一个对象(它往往被 new 实例化的过程中声明为对象),用这个属性来引用 A
继承是指, B.prototype 引用了 A ,所以说 B (其实是 B 的 prototype 属性)继承了 A (构造)的属性。
区分
原型:声明一个属性 prototype ,引用一个对象。该属性引用的对象,是该属性所属对象的原型;
继承:通过执行 new ConstructFunc()、 Object.create(obj)继承。
《 JavaScript 权威指南》的不解释,让原型“看起来很难的样子”,理解了发现其实就是个引用对象。
这样理解没错吧?我用代码试的时候没错,担心漏了什么……
1
hbkdsm 2015-10-15 10:43:38 +08:00 1
感觉楼主还没分清 prototype, __proto__ 和 [[Prototype]],还需努力。
|
2
luoway OP |
3
mcfog 2015-10-15 11:45:19 +08:00
@luoway 去看 ECMAScript 标准吧,虽然有点枯燥拗口,但能啃下来以后这块就毫无问题了,有疑问也只要翻翻标准条文就能解释
|
4
hbkdsm 2015-10-15 11:52:10 +08:00
|
5
luoway OP |
6
luoway OP @hbkdsm 更新了
原型: 所有对象都有一个叫做 [[Prototype]] 的内部属性,它用于实现继承。 自有对象( Object 、 Array 、 Function )有原生属性 prototype 暴露内部属性[[Prototype]], prototype 指向被继承的原型。 __proto__属性指向该对象继承的原型,可以改变__proto__以改变指向哪个原型。 继承: 三种方法实现继承。 new Constructor()、使对象__proto__属性指向被继承原型、 Object.create(obj [, properties])。 |
7
tftk 2015-10-16 12:46:10 +08:00
__proto__ 就是 [[Prototype]],根据引擎实现不同。
自有对象( Object 、 Array 、 Function )有原生属性 prototype 暴露内部属性[[Prototype]], prototype 指向被继承的原型。 对象默认继承自 Object 的原型。 |
8
luoway OP |
9
tftk 2015-10-16 13:20:01 +08:00
|
10
luoway OP @tftk
> __proto__ 是指向 继承自的 对象的 原型 所以指向原型的原型? 对象属性、自定义的对象没有 prototype , var A = { say: "This is A" }, B = {}; function F(){} console.log(B.prototype); //undefined console.log(F.prototype); //{constructor: function F()} console.log(B.__proto__); //Object console.log(B.__proto__.prototype); //undefined [[Prototype]]是在创建对象的时候自动获得的,但 prototype 不是。 看这个: console.log(Object.__proto__);//function() console.log(Object.prototype);//Object 自有对象的 prototype 能正确地指向原型,非自有对象的__proto__也能正确地指向原型。 自有对象的__proto__不正确指向,非自有对象的 prototype 不存在。 |