原型继承:将函数原型复制到另一个

时间:2016-11-25 04:34:27

标签: javascript oop

将函数原型复制到另一个函数有什么危害,如下所示。

function Person(){}
Person.prototype = {};
function Author(){}
Author.prototype = Person.prototype;

3 个答案:

答案 0 :(得分:1)

JS中的对象赋值创建引用。

var o = {};
var c = o;

现在,对象oc都指向同一个对象。当尝试将一个对象的原型分配给另一个对象时,同样的规则适用。

Author.prototype = Person.prototype;

现在,AuthorPerson的原型都指向一个对象。如果将一些数据放到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);

实例的数据唯一性将会丢失。