有关JavaScript中继承的问题

时间:2011-01-25 14:02:43

标签: javascript jquery oop inheritance

您能解释下面提到的两个代码之间的区别吗?

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

function Ninja(){} 

Ninja.prototype = Person.prototype; 

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

function Ninja(){} 


Ninja.prototype = new Person();

我对这些方面感到困惑:

Ninja.prototype = Person.prototype; 

Ninja.prototype = new Person();

我开始知道第二个支持继承而第一个支持继承,你能解释一下第二个支持魔法吗?

1 个答案:

答案 0 :(得分:14)

  1. 设置Ninja.prototype = Person.prototype;所有Ninjas都是人,所有人都是Ninjas ,因为它只是让两个原型指向同一个东西。因此,更改Ninja.prototype将更改Person.prototype,反之亦然。

  2. 设置Ninja.prototype = new Person();表示所有Ninjas都是常规人,但可以修改Ninja.prototype而不更改Person的定义。这里的关键是new关键字,它创建Person的唯一实例,因此可以自由修改而不会影响其他任何内容。


  3. Ninja.prototype = Person.prototype

    的示例

    Ninja的原型定义为与Person的相同:

    function Person() {}
    Person.prototype.dance = function () {}; // A Person can dance
    
    function Ninja() 
    Ninja.prototype = Person.prototype; // Now a Ninja can dance too!
    

    Ninja实例具有Person的能力:

    var ninja = new Ninja();
    ninja.dance();
    

    ,对Ninja定义的修改也会影响Person的实例:

    Ninja.prototype.kill = function () {}; // Oh no! Now a Person can kill too!
    var bob = new Person();
    bob.kill(); // Not what we wanted...
    

    Ninja.prototype = new Person()

    的示例

    以与以前相同的方式定义Person

    function Person(){};
    Person.prototype.dance = function () {}; // A Person can dance
    

    现在我将Ninja.prototype = new Person()分成两步。首先,创建一个名为Person的新defaultNinja

    var defaultNinja = new Person(); // Despite the name, it's just a regular Person
    

    然后将所有Ninja定义为默认值:

    function Ninja(){};
    Ninja.prototype = defaultNinja; // Really the same as Ninja.prototype = new Person();
    

    这一次,如果我们改变Ninja可以做的事情:

    Ninja.prototype.kill = function () {};
    // OR,
    defaultNinja.kill = function () {};
    

    Person的实例不受影响:

    ninja.kill(); // Now the ninja can kill
    var bob = new Person();
    bob.kill(); // ERROR, because Person.prototype doesn't have kill(),
                // only defaultNinja does