关于什么是 prototype、原型、继承,我这种简单到两三句话的理解有没有错误?

2015-10-15 10:12:57 +08:00
 luoway

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 权威指南》的不解释,让原型“看起来很难的样子”,理解了发现其实就是个引用对象。


这样理解没错吧?我用代码试的时候没错,担心漏了什么……

2338 次点击
所在节点    JavaScript
10 条回复
hbkdsm
2015-10-15 10:43:38 +08:00
感觉楼主还没分清 prototype, __proto__ 和 [[Prototype]],还需努力。
luoway
2015-10-15 11:34:01 +08:00
@hbkdsm 感谢指出

详细了解__proto__让我发现了我理解上的很多疏漏

继续努力

[[Prototype]]是什么搜索不到,能否再指点一下?
mcfog
2015-10-15 11:45:19 +08:00
@luoway 去看 ECMAScript 标准吧,虽然有点枯燥拗口,但能啃下来以后这块就毫无问题了,有疑问也只要翻翻标准条文就能解释
hbkdsm
2015-10-15 11:52:10 +08:00
@luoway http://lzw.me/pages/ecmascript/#79
对象的 [[Prototype]] 是一个内部属性,用于引用该对象的原型对象
luoway
2015-10-15 12:01:31 +08:00
@mcfog 现在我在试图总结和解释,虽然手上只有《 JavaScript 权威指南》,里面也解释不连贯。

@hbkdsm 谢谢,我好好看看,再来修改和完善自己的解释。
luoway
2015-10-15 18:57:59 +08:00
@hbkdsm 更新了


原型:
所有对象都有一个叫做 [[Prototype]] 的内部属性,它用于实现继承。
自有对象( Object 、 Array 、 Function )有原生属性 prototype 暴露内部属性[[Prototype]], prototype 指向被继承的原型。
__proto__属性指向该对象继承的原型,可以改变__proto__以改变指向哪个原型。

继承:
三种方法实现继承。
new Constructor()、使对象__proto__属性指向被继承原型、 Object.create(obj [, properties])。
tftk
2015-10-16 12:46:10 +08:00
__proto__ 就是 [[Prototype]],根据引擎实现不同。

自有对象( Object 、 Array 、 Function )有原生属性 prototype 暴露内部属性[[Prototype]], prototype 指向被继承的原型。

对象默认继承自 Object 的原型。
luoway
2015-10-16 12:58:22 +08:00
@tftk 感谢提出
> __proto__ 就是 [[Prototype]],根据引擎实现不同。
prototype 也是[[Prototype]]

能说说两者的不同吗?
tftk
2015-10-16 13:20:01 +08:00
@luoway
__proto__ 是指向继承自的对象的原型,是和对象的原型的关系。

prototype 是当前对象的属性,在创建对象的时候自动获得的,指向当前对象的原型对象。
luoway
2015-10-16 13:32:13 +08:00
@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 不存在。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228179

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX