【问题标题】:JavaScript __proto__ will affect the original function in the Object?JavaScript __proto__ 会影响 Object 中的原有函数吗?
【发布时间】:2015-12-31 05:45:40
【问题描述】:

函数getBooks 已在Author.prototype 中定义。但不能在Author 对象中使用。当我使用__proto__ 继承Person 属性时。为什么Author 对象没有getBooks 功能?是__proto__的效果吗?

function Person(name){
    this.name = name;
}
function Author(name,books){
    Person.call(this,name);
    this.books = books;
}
Person.prototype.getName = function(){
    return this.name;
}

Author.prototype.getBooks = function() {
    return this.books;
}

var john = new Person('John Smith');

var authors = new Array();

authors[0] = new Author('Dustin Diaz',['JavaScript Design Patterns']);
authors[1] = new Author('Ross Harmes',['JavaScript Design Patterns']);

authors[0].__proto__ = new Person();

console.log(john.getName());
console.log(authors[0].getName());
console.log(authors[0].getBooks())

【问题讨论】:

  • 你不应该使用__proto__,因为它是 FF 和 Chrome 中可用的供应商特定属性,并且不包含在原始规范中。
  • 您能简单地解释一下您要完成的工作吗?为什么要尝试更改 Author 实例的原型,而不是将 Author 原型链接到 Person?
  • @Arkantos 好吧,她/他可以用Object.setPrototypeOf 替换__proto__,但这并不能改变他正在尝试做的基本问题。
  • 谢谢大家对我的问题@torazaburo的帮助,我刚开始学习javascript面向对象编程。我尝试学习使用 proto 来继承一个对象。但是我不太了解proto的用法。另外,我不知道为什么仍然可以使用 Author 的变量。但是不能使用 Author Object 的功能。之后,使用 proto 继承 Person 属性。

标签: javascript prototype


【解决方案1】:

__proto__deprecated。而是将类的原型分配给您尝试继承的类的新实例,然后再向该类添加新的原型方法。

function Author(name, books) {
  Person.call(this, name);
  this.books = books;
}

Author.prototype = new Person();
Author.prototype.constructor = Author;

Author.prototype.getBooks = function() {
  return this.books;
};

JSFiddle 演示:https://jsfiddle.net/bkmLx30d/1/

【讨论】:

  • 是的,就答案的第一部分而言,但就第二部分而言,我不是临时多重继承的忠实拥护者。理论上原型应该是动态的,而这种方法只是对原型的当前状态进行静态“快照”。它也无法捕获任何附加的原型,这些原型沿着混入的“类”的原型链上升。无论如何,不​​太清楚你为什么要在这里提出这个问题,因为它似乎与 OP 的问题无关.
【解决方案2】:

您已在此处更改了 authors[0].__proto__ = new Person(); 对象的原型,因此您在 authors 中的第一个 Author 对象现在有一个设置为 Person() 对象的原型。

当您执行authors[0].getBooks() 时,authors[0] 将在原型中搜索getBooks(),但由于Person.prototype 没有getBooks(),因此会出错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多