javascript|[[Prototype]] ——原型链两万字全面解析「建议收藏」( 四 )


这个对象究竟是什么?
最直接的解释就是 , 这个对象是在调用 new Foo() 时创建的 , 最后会被关联到这个 「Foo 点 prototype」对象上 。


我不明白它这句话的意思 , 这个对象是在调用 new Foo() 时创建的?
这似乎是说当在只有当调用 new 的时候 , 才会创建  prototype, 但是这个函数 Foo 被创建的时候 , Foo.prototype 就已经存在了 。
最后被关联到 foo 的 prototype 对象 , 这句话的意思是 new Foo() 创建的对象 , 和 Foo.prototype 是同一个对象吗?
这里的意思很不清晰 , 应该是翻译的问题 。
function Foo() {
Foo.prototype = {a:121
var a = new Foo()
// 获取 a 的原型对象
Object.getPrototypeOf( a ) // { a: 121 
a // { ___proto___: { a: 121  


似乎 , a 的原型和 Foo 的原型对象是同一个 。
调用 new Foo() 时会创建 a , 其中的一步就是给 a 一个内部的 [[Prototype

链接 , 关联到 Foo.prototype 指向的那个对象 。
暂停一下 , 仔细思考这条语句的含义 。

给 a 一个内部 [[Prototype

链接 , 关联到 Foo.prototype 指向的那个对象?
为什么要说的这么拗口?
直接说明: a 的原型绑定在 Foo 的原型上 , 它不简单明了吗?
这该死的翻译 , 傻逼!
在面向类的语言中 , 类可以被复制多次 , 就像用模具制作东西一样 。 我们以前看到过 , 之所以会这样是因为:实例化一个类就意味着「把类行为复制到物理对象中」 , 对于每一个实例都会重复这个过程 。

实例化是对蓝图的实体化 。 妈的 , 你个傻逼翻译 , 写你妈呢?
但是在 JavaScript 中 , 并没有类似的复制机制 。 你不能创建一个类的多个实例 , 只能创建多个对象 , 它们 [[Prototype

关联的是同一个对象 。 但是在默认情况下并不会进行复制 , 因此这些对象并不会完全失去联系 。 它们是互相关联的 。

JavaScript 中并不存在真正的类 , 只有对象 。 相关的原型将这些对象联系在一起 。
new Foo() 会生成一个新对象 , 这个新对象的内部链接 [[Prototype

关联的是 Foo.prototype 对象 。

这就是这所有小节的唯一论点 , 妈的 , 难道不应该直接抛出来吗?为什么要在中间写出来 。。
最后我们得到了两个对象 , 它们之间互相关联 , 就是这样 。 我们并没有初始化一个类 , 实际上我们并没有从「类」中复制任何行为到一个对象中 , 只是让两个对象相互关联 。

类的数据结构是一个栈 , 而实例化是一个复制拷贝的过程 。
JavaScript 中并没有 栈 这个结构 , 而复制拷贝是对这个结构的模仿 。
所以 , JavaScript 中没有真正的类 。 只是对类行为的模仿 。
实际上 , 绝大多数 JavaScript 开发人员都不知道的秘密是:new Foo() 这个函数调用实际上并没有直接关联 , 这个关联是一个意外的副作用 。new Foo() 只是间接完成了我们的目标:一个关联到其他对象的新对象 。

一个关联到其他对象的新对象?
这句话是似乎是重点 , 但是你他妈在说尼玛呢?
一个新对象?关联其他对象?
这里的一个对象是指新创建的对象 , 这个对象的创建通过 new 创建 , 关联到其他对象也是 new 关键字的功能 , 将新对象和 Foo 对象进行绑定 。