js原型的一个问题

例子1
function Person(name) {
    this.name = name
}
// 修改原型
Person.prototype.getName = function() {}
var p = new Person('jack')
console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // true

例子2
function Person(name) {
    this.name = name
}
// 重写原型
Person.prototype = {
    getName: function() {}
}
var p = new Person('jack')
console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // false

最后p.constructor.prototype还是有点不理解?

阅读 2.8k
5 个回答
Person.prototype = {
    getName: function() {}
}
var p = new Person('jack');
// 例子二中 相当于赋值成了一个对象。这时p.constructor指向了Object。而不是构造器函数Person
// 需要修正:
p.constructor = Person;
console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // true
Person.prototype.getName // 这个是在默认的prototype对象上增加一个属性,此时constructor指向Person
Person.prototype = {
    // ...
}
// 这个是将prototype的指向改变为新的对象,此时constructor属性指向对象的构造函数Object类,自己输出一下看看

此时可以手动更改constructor属性

Person.prototype.constructor = Person
或者
Person.prototype = {
    constructor: Person,
    getName: function() {}
}

看看这篇文章

如果 p.constructor = Person; 的话,那么以后所有Persion的实例都要手动将constructor指向Person,不是从根本解决问题。

Person.prototype = {
}

这种写法已经完全重写了原型,此时你觉得Person.prototype.constructor是啥?自己测试。

每个js函数自动拥有一个prototype属性,这个属性的值是一个对象,这个对象包含了唯一一个不可枚举的属性:constructorconstructor属性的值就是这个函数。
Person.prototype可以设置为任何一个对象,不过需要把constructor修正一下指向Person

发生了值传递

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题