function Person(name, age, height) {
this.name = name,
this.age = age,
this.height = height
}
var john = new Person("John", 24, 175);
应该避免我读到的内容:
john.__proto__.fact = "I am a humanly human!"
应该做些什么:
Person.prototype.fact = "I am a humanly human!"
答案 0 :(得分:0)
如果要添加到john
引用的对象的原型,通过john.__proto__
这样做会给代表的读者留下一个印象,即此更改特定于john
不知何故,它不是;它会影响使用该原型(当前和未来)的所有对象。使用Person.prototype
不会给出这种印象,它会正确地表明您正在做什么。
另外,请注意并非所有对象(甚至所有具有原型的对象)都具有__proto__
,因为__proto__
是从Object.prototype
继承的,但并非所有对象都从{{1}继承}。因此,在新代码中,最好完全避免Object.prototype
;如果您需要获取对象的原型,请使用__proto__
:Object.getPrototypeOf
。
在评论中,您已经回答了为什么要这样做的问题:
添加方法,使得它们不会出现在您创建的每个Person对象中。
...但这正是添加到Object.getPrototypeOf(john)
会做的事情:将方法添加到每个john.__proto__
对象(间接通过原型),当前和未来,就像添加到{{1}一样} - 因为那些(和Person
)只是获取相同对象的不同方式:
Person.prototype
如果您只想为Object.getPrototypeOf(john)
引用的对象添加方法,请不要使用function Person(name) {
this.name = name;
}
var john = new Person("John");
console.log(john.__proto__ === Person.prototype); // true
console.log(Object.getPrototypeOf(john) === Person.prototype); // true
var paul = new Person("Paul");
john.__proto__.someNewMethod = function() {
console.log(this.name);
};
john.someNewMethod(); // "John"
paul.someNewMethod(); // "Paul"
或john
:只需执行:
__proto__