与'prototype'相比,为什么用__proto__向对象原型添加属性是不是很糟糕?

时间:2018-02-22 10:27:42

标签: javascript javascript-objects

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!"

1 个答案:

答案 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__