将函数原型复制到另一个函数有什么危害,如下所示。
function Person(){}
Person.prototype = {};
function Author(){}
Author.prototype = Person.prototype;
答案 0 :(得分:1)
JS中的对象赋值创建引用。
var o = {};
var c = o;
现在,对象o
和c
都指向同一个对象。当尝试将一个对象的原型分配给另一个对象时,同样的规则适用。
Author.prototype = Person.prototype;
现在,Author
和Person
的原型都指向一个对象。如果将一些数据放到Author
的原型属性中,那么Person也会有相同的数据。对于不同的对象,这是最不期望的。
这样做的正确方法之一是
Author.prototype = Object.create(Person.prototype);
在这里为Author.prototype
创建一个全新的对象 - 但继承自Person
对象。
答案 1 :(得分:0)
因为您通过引用传递原型,这意味着两者都受到所有更改的影响。考虑:
function Person(){}
Person.prototype = {};
function Author(){}
Author.prototype = Person.prototype;
Author.prototype.books = [];
var bob = new Person();
console.log(bob.books); // this will be an empty array, not undefined as one would expect.
答案 2 :(得分:0)
将方法附加到原型的理想方法是创建一个由实例创建的对象。
function Person(){
this.test = "1";
}
function Author(){}
Author.prototype = new Person();
这样你就可以创建一个新的person实例,并将返回的对象输入到Author中。
如果你只是复制它怎么办?
如果您只是复制相同的实例,则在原型中共享,一个原型中的更改将全部反映出来。
function b(){
this.test = 'a';
this.test1 = function(){
console.log('test1');
}
this.test2 = function(){
console.log('test2');
}
}
function a(){
}
function c(){
}
a.prototype = new b();
var a1 = new a();
c.prototype = a.prototype;
a.test = 'asdf';
console.log(c.test);
实例的数据唯一性将会丢失。