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


1.this.name = name 给每个对象都添加了 name 属性 , 有点像类实例的封装的数据值 。 2.Foo.prototype.myName = .. 可能是个有趣的技巧 , 它会给 Foo.prototype 对象添加一个属性 。 现在 ,a.name() 可以正常的工作 , 但是你可能会觉得惊讶 , 这是什么原理呢?
在这段代码中 , 看起来似乎创建了 a 和 b 时会把 Foo.prototype 对象复制到这两个对象中 , 然而事实是不是这样呢?
在本章开头介绍默认 [[Get

算法时我们介绍过 [[Prototype

链 , 以及当属性不直接存在于对象时如何通过它来进行查找 。
因此 , 在创建的过程当中 , a 和 b 的内部 [[Prototype

都将会关联到 Foo.prototype 上 。 当 a 和 b 中无法找到 myName 时 , 它会通过在 Foo.prototype 上找到 。


Foo.prototype.myName 中的 myName 属性并没有绑定在 a 和 b 对象上 , 而是绑定在 Foo 的原型对象上 , 而 Foo 的原型就是 a 和 b 的原型 , 这个指定的过程是通过 new 关键字来完成的 , new 关键字将 a、b 与 Foo.prototype 连接起来 。
回顾「构造函数」之前讨论 constructor 属性时我们说过 , 看起来 a.constructor === Foo 为 true 意味着 a 确实有一个指向 Foo 的 constructor 属性 , 但是事实不是这样 。
这是一个很不幸的误解 , 实际上 , constructor 引用同样被委托给了 Foo.prototype , 而 Foo.prototype.constructor 默认指向 Foo 。

这似乎说的是 Foo.prototype.constructor 默认指向 Foo 但是在调用 new 之后 , 就变了?
这段话似乎和下段文字是相违背的 , 妈的 , 傻逼翻译 , 草拟妈!
constructor 说的是 a.constructor 同样被委托给了 Foo.prototype
function Foo(name){
  this.name = name

Foo.prototype.myName = function() {
  return this.name


var a = new Foo('foo')
var b = new Foo('bar')

a.name // 'foo'
b.name // 'bar'

a // Foo { name: 'foo' ___proto___: { constructor: ? Foo() myName: ? ()  

var c = new a.constructor('2121')
c  // Foo { name: '2121' ___proto___: { constructor: ? Foo() myName: ? ()  

把 constructor 属性指向 Foo 看作是 a 对象由 Foo 「构造」非常容易理解 。 但这只不过是一种虚假的安全感 。a.constructor 只是默认的 [[Prototype

委托指向 Foo , 这和「构造」毫无关系 。 相反 , 对于 constructor 的错误理解很容易对你自己产生误导 。

a.constructor 不是构造 , 而是将 [[Prototype

委托指向 Foo
举例来说 , Foo.prototype 的 constructor 属性只是 Foo 函数在声明时的默认属性 。 如果你创建了一个新对象并替换了函数默认的 prototype 对象引用 , 那么新对象并不会自动获得 constructor 属性 。
function Foo(name) {  this.name = nameFoo.prototype = {var a = new Foo(2121)a // { name: 2121 a.constructor === Foo // falsea.constructor // ? Object()
Object() 并没有「构造」 a , 对吧?看起来应该是 Foo() 「构造」了它 。 大部分开发者都认为是 Foo() 执行了构造工作 , 但是问题在于 , 如果你认为「constructor」表示「由……构造」的话 , a.constructor 应该是 Foo , 但是它不是 Foo!
到底怎么回事? a 并没有 constructor 属性 , 所以它会委托 [[Prototype