2012-10-26 52 views
4

我對以下代碼的期望是,如果我檢查了a.name,它會搜索原型並在聲明時返回原型。任何人都可以指出這是什麼阻止JS承認我的原型?Javascript原型怪癖 - 任何人都可以解釋一下嗎?

var obj = function(parent){ 
    return { 
     prototype: parent 
    } 
}; 

var me = { name: 'keith' }; 

var a = new obj(me) 
// => undefined 

a.name 
// => undefined 

a.prototype.name 
// => "keith" 

回答

1

命名爲「原型」的屬性只是一個屬性,它不指向該對象從中繼承的對象。使用Object.getPrototypeOfnon-standard __proto__ property來獲得。

所以你的函數obj(me)返回的只是一個屬性爲「原型」的對象,它指向一個屬性爲「name」的對象,它指向字符串keith。當你的函數返回一個對象時,它是否被new keyword調用也沒有區別。

對於繼承,構造函數function [object]的「prototype」屬性值得關注。此構造函數創建的每個對象(不返回對象)與new關鍵字都從構造函數指向的「prototype」屬性所繼承的對象繼承。所以,你可以這樣做:

var Constructor = function() { 
    console.log(this); // logs the currently created object 
    // return nothing 
} 
Constructor.prototype = { name: 'keith' }; 

var a = new Constructor(); // logs an empty object 
Object.getPrototypeOf(a) === Constructor.prototype; // true 
a.name; // "keith" - inherited 
0

我懷疑你是覆蓋在一個類似的方式prototype屬性如何可以覆蓋undefined「值」。

-1

你似乎用一個假的覆蓋了真正的原型。

+0

他只是增加了一個新的屬性'obj.prototype'命名爲原型 –

+0

我覺得棒實際上是正確的,它看起來像不知何故,我取消了內部鏈接到「原型」,並取代了它具有JavaScript不會實現原型功能的屬性。我認爲這可能是新的關鍵字首先初始化對象,然後*然後*覆蓋原型與一個新的值,這是不在範圍鏈 – netpoetica

1

在函數中,你沒有觸及函數原型。您只是將具有屬性「prototype」的新對象作爲值返回給父項。因此,您只能通過該屬性訪問它。

看來你正試圖實現繼承,這裏是關於一個很好看的:Prototypal Inheritance in JavaScriptClassical Inheritance in JavaScript

+0

嘿,你是對的,我想在這裏繼承。感謝那些文章。我已經徹底地閱讀了,但我認爲這是醜陋的,必須使用一個函數返回你的對象,而不是在其創建中使用「新」。我認爲這有點難以理解。希望找到一種方法來使用「新」的可能性 – netpoetica

0

這裏的問題是,你正在返回一個名爲prototype與親值,這是一個對象的屬性,所以你正在返回prototype = {name = 'keith'},當你調用新的obj時,你正在向a的原型添加一個名爲prototype的新屬性。

你只需要一點改變,我需要這是你正在嘗試做的。這將工作,只是要小心超載屬性。

var obj = function(parent){ 
    for(var propt in parent){ 
     this[propt] = parent[propt]; 
    } 
} 

var me = { name: 'keith' }; 
var a = new obj(me); 
console.log(a); 
// => Object { name="keith"} 
console.log(a.name); 
// => "keith" 

編輯:如果您使用的原型尋找繼承,你應該read this或嘗試TypeScript,一個新的JavaScript類型和OO庫

+0

這實際上只是將屬性從一個對象克隆到另一個對象,而我最終希望能夠使用「原型」,因爲在一個對象中使用「超級」屬性古典語言。這會工作,但它不是完全繼承:-) – netpoetica

+0

你沒有提到繼承。你在'java'中引用'super'關鍵字? –

+0

@Keith,檢查我的編輯 –

相關問題