2012-05-12 88 views
4

我儘量不重複明顯的問題,因爲我已經看到了關於道格拉斯Crockford的JavaScript中的好零件手冊Function.prototype.method什麼是原型[名]

我瞭解大部分代碼

的一些問題/答案
Function.prototype.method = function (name, func) { 
this.prototype[name] = func; 
return this; 
}; 

Function.method('inherits', function (Parent) { 
this.prototype = new Parent(); 
return this; 
}); 

var Mammal = function (name) { 
this.name = name; 
}.method('get_name', function() { 
return this.name; 
}).method('says', function() { 
return this.saying || ''; 
}); 

var Cat = function (name) { 
this.name = name; 
this.saying = 'meow'; 
}.inherits(Mammal) 

var myCat = new Cat('bagsley'); 
myCat.get_name(); 

我得到的麻煩是this.prototype [name]爲什麼不寫成this.prototype.name;我知道這回可鏈接和這裏的語法看起來非常相似,jQuery的,但我仍然沒有得到原型[名]部分

任何幫助apprecaited 感謝

+0

http://stackoverflow.com/questions/4968406/javascript-property-access-dot-notation-vs-brackets – Jack

+0

它分配的參數,以一個新的對象,這就是爲什麼能」不要使用點符號。 – elclanrs

+0

@elclanrs不,不能使用點符號,因爲屬性名稱是動態字符串。 –

回答

3

obj.nameobj[name]之間的差異。

這...

obj.name = 123; 

...將值123分配(對象)的"name"財產。

在另一方面,本...

obj[ name ] = 123; 

...將分配值123到哪個名稱等於name變量/參數的值的那些屬性。

所以:

var name = 'foo'; 

obj.name = 123; 
obj[ name ] = 456; 

// And now: 
obj.name; // 123 
obj.foo; // 456 
+0

感謝森那這是一個有益的澄清 –

+0

我插入螢火這和它的工作,以證明你的觀點,但很明顯,我絕不會運行此代碼var name ='frank' Function.prototype.method = function(name,func){ this.prototype.frank = func; 返回此; }; 功能。方法('frank',function(Parent){this.prototype = new Parent(); return this; }); var Mammal = function(name){ this.name = name; }。方法( '坦率',函數(){ \t返回this.name; }) VAR貓=函數(名稱){ this.name =名; this.saying ='meow'; } .frank(Mammal) var myCat = new Cat('bagsley'); myCat.frank(); –

+0

@ user974959嗯,我沒有完全得到你最後的評論。你還有其他問題要問嗎? –

2

prototype[name]允許name是包含一個變量任何字符串,並且它將訪問由字符串命名的prototype的屬性。 prototype.name將查找字面上稱爲「名稱」的財產。

[]語法允許您: - (如:obj['foo-bar']arr[123]

  1. 具有可變屬性名稱通過屬性與被否則不允許在屬性名for..in
  2. 使用符號
  3. 循環時特別有用
  4. 與其他語言(如PHP)的關聯數組更接近。
+0

謝謝您的回答Kolink這是非常有幫助我感謝您的反饋 –