【问题标题】:javascript inheritance confusionjavascript继承混淆
【发布时间】:2013-03-15 04:29:59
【问题描述】:

这是一些代码

var Animal = function (name,color,sound){
    this.name = name;
    this.color = color;
    this.sound = sound;
}

Animal.prototype.doSomething = function (){
                              alert(this.sound);
}

var cate = new Animal('cate','black','meow');

cat.doSomething(); \\alerts 'meow' 

now i create another constructor function 

var Person = function (name){
    this.name = name;
}

下面我用 Animal.prototype 初始化了一个 Person.prototype

Person.prototype = Animal.prototype;

所以现在我们知道对象被分配为引用Person.prototype = Animal.prototype 会将Animal.prototype 分配给Person.prototype,所以如果我们向Person.prototype 添加类似

的方法
Person.prototype.doSomethingElse = function (){
                                   alert("some text to test");
}

Animal.Prototype 是否也获得了Person.prototypedoSomethingElse 方法。

cate.doSomethingElse();

【问题讨论】:

  • 不确定。试一试,找出答案! jsfiddle.net/bryanjamesross/d4g3a
  • 是的,确实如此。是这个问题吗?
  • 是的,这是好事吗?
  • 抱歉,这里没有看到问题。

标签: javascript inheritance


【解决方案1】:

如果你这样做,只是为了澄清事情:

function Animal(){}
function Person(){}

Person.prototype = Animal.prototype;

那么AnimalPerson共享同一个prototype对象,并且赋值后构造的AnimalPerson的所有实例都具有相同的[[Prototype]]

如果你这样做:

Person.prototype = new Animal();

这将使Person.prototype 成为Animal 的实例,因此Person 的实例将共享Animal.prototype 的所有方法,Animal 的实例将不共享任何自己的属性的Person.prototype

例如如果你给Person.prototype添加一个方法,它不会被Animal的实例继承:

Person.prototype.foo = function(){};
var p = new Person();
var a = new Animal();

typeof p.foo; // function
typeof a.foo; // undefined

【讨论】:

    【解决方案2】:

    在您当前的代码中,两个原型引用都是完全相同的对象。当你说

    Person.prototype = Animal.prototype;
    

    然后

    Person.prototype === Animal.prototype; // true
    

    因此,您添加到Person.prototype 的任何方法也将在Animal.prototype 中(实际上,不是“也”;只有一个对象充当两个构造函数的原型)。

    为避免这种情况,您可以使用 this 之类的函数:

    function object(o) {
        function F() {}
        F.prototype = o;
        return new F();
    }
    Person.prototype = object(Animal.prototype);
    

    在现代浏览器中,您可以改用Object.create

    Person.prototype = Object.create(Animal.prototype);
    

    【讨论】:

    • 当我提醒时(Animal.doSomethingElse);它的未定义?
    • 因为你把它添加到了Person.prototype中,所以Animals没有它,只有Persons。
    • 所以我假设默认情况下,javascript 参数是按值传递给方法的,这是唯一有意义的解释。
    • 是的,注意值要么是原语(数字、字符串),要么是对对象的引用(如本例所示)。
    • @raziqijr 我不确定你想要什么。不建议您这样做(共享原型)的方式,因为 Person 没有自己的原型。如果你添加 Person.prototype.talk,你会让猫说话。我展示的代码是一种避免的方法。尽管如此,您添加到 Animal.prototype 的任何内容仍然可以在 Person 实例上使用(但反之亦然)。
    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 2016-11-19
    • 1970-01-01
    • 2011-12-30
    • 2015-10-12
    • 1970-01-01
    • 2011-04-25
    • 2019-12-08
    相关资源
    最近更新 更多