2014-01-08 77 views
1

PersonMe是構造函數:將原型設置爲對象和函數有什麼區別?

function Person(){//define something here}; 
function Me(){}; 

現在是什麼

Me.prototype = Person; 

Me.prototype = new Person(); 

之間的區別?

+0

'Me.prototype = Person'設置對原始'Person'函數的引用。 'Me.prototype = new Person()'設置對原始'Person'函數的新實例的引用。 – crush

回答

2

Me.prototype的類型是對象。

您添加的方法來此對象,他們將連接實例Person

那麼,你應該什麼時候使用Me.prototype = new Person();

(舉例) - 當你想通過多態性檢查instanceof

例如:

function Ninja(){} 

Ninja.prototype =new Person(); 

var n = new Ninja(); 

n instanceof Person //true; 
+0

因此,函數Me(){}; Me.prototype = new Person();'將有一個不同於'function You(){}的原型; You.prototype = new Person();',對嗎?並且改變一側的原型屬性不會影響另一側? – OneZero

+0

這是正確的...... –

+0

不是一個不好的解釋方式 – crush

0

物體的原型也是對象。 Person是一個函數/構造函數,而new Person()返回一個對象(人員實例)。 因此,最簡單的邏輯推論是第二個任務正在做你期望的事情。

現在..在JS功能也是對象...這可能是你的困惑的原因。
所以,如果你的對象的原型指向一個功能:

Me.prototype = Person; 

那麼你的對象將繼承該函數的原型,這是功能「類」它意味着你以前的分配可以翻譯成:

Me.prototype = new Function(); 

這顯然不是你想要的。
我希望我提出一點,它會幫助你在原型繼承混亂。

+0

我仍然困惑於此,不應該原型繼承一​​切'Person'函數,包括任何特定於'Person'的東西?爲什麼在這種情況下它只能繼承到'Person'函數對象的原型部分? – OneZero

0

考慮下面的代碼:

function A() {} 
A.prototype.foo = function() { return 'bar' }; 
function B() {} 
function C() {} 

B.prototype = A 
C.prototype = new A() 

b = new B() 
c = new C() 

console.log('b instanceof A', b instanceof A); 
console.log('c instanceof A', c instanceof A); 
console.log('b.foo && b.foo()', b.foo && b.foo()); 
console.log('c.foo && c.foo()', c.foo && c.foo()); 

應該告訴你,做B.prototype = A是錯誤的。現在背後的原因是約定和實施。函數的原型是對象的對象字段的一個實例,一旦函數被用作構造函數,它就成爲方法和屬性。

相關問題