JavaScript __proto__会影响Object中的原始函数吗?

时间:2015-12-31 05:45:40

标签: javascript prototype

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())

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

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

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