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 上找到 。
回顾「构造函数」之前讨论 constructor 属性时我们说过 , 看起来 a.constructor === Foo 为 true 意味着 a 确实有一个指向 Foo 的 constructor 属性 , 但是事实不是这样 。
Foo.prototype.myName 中的 myName 属性并没有绑定在 a 和 b 对象上 , 而是绑定在 Foo 的原型对象上 , 而 Foo 的原型就是 a 和 b 的原型 , 这个指定的过程是通过 new 关键字来完成的 , new 关键字将 a、b 与 Foo.prototype 连接起来 。
这是一个很不幸的误解 , 实际上 , 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 的错误理解很容易对你自己产生误导 。
举例来说 , Foo.prototype 的 constructor 属性只是 Foo 函数在声明时的默认属性 。 如果你创建了一个新对象并替换了函数默认的 prototype 对象引用 , 那么新对象并不会自动获得 constructor 属性 。
a.constructor 不是构造 , 而是将 [[Prototype
委托指向 Foo
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
- 编程|芒果口袋携手阿里巴巴地推第一人王志坚又掀业内新浪潮——成就数字化行业新高度!
- 九江市疾控中心新冠肺炎疫情常态化防控相关防护指南——图书馆篇
- 软件|黑色基调 ——西数SN770评测
- 传统媒体|品牌出海:Facebook广告投放指南——优惠广告怎么创建?
- 通讯:血染的小白鞋——一位“猪湾事件”幸存者的控诉
- 惠普新一代轻薄本——星14青春版|惠普星14青春版开售:全新12代酷睿 仅4099元
- javascript|在B端和C端公司做公关,有什么区别?
- javascript|现在分布式、云智能时代,应用软件开发简直得JavaScript者得天下
- 携程|现在分布式、云智能时代,应用软件开发简直得JavaScript者得天下
- 云米|0—1999元手机性价比排名:OPPO K9 Pro上榜!