[英]Question regarding Inheritance in JavaScript
你能解釋下面提到的兩個代碼之間的區別嗎?
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();
我開始知道第二個支持繼承而第一個支持繼承,你能解釋一下第二個中的魔法是什么嗎?
設置Ninja.prototype = Person.prototype;
是說所有忍者都是人,所有人都是忍者 ,因為它只是使兩個原型指向同一個東西。 因此,更改Ninja.prototype
將更改Person.prototype
,反之亦然。
設置Ninja.prototype = new Person();
我說Ninjas都是一個普通人 ,但是Ninja.prototype
可以在不改變Person
定義的情況下進行修改。 這里的關鍵是new
關鍵字,它創建了Person
的唯一實例 ,因此可以自由修改而不會影響其他任何內容。
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()
分為兩個步驟。 首先,創建一個名為defaultNinja
的新Person
:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.