2012-05-12 4 views
4

Я стараюсь не дублировать вопросы, очевидно, как я видел некоторые вопросы/ответы относительно 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(); 

у меня возникли проблемы с получением этого.prototype [name], почему он не написан как this.prototype.name; Я знаю, возвращая это позволяет сцепление и синтаксис здесь очень похож на JQuery, но я до сих пор не получить прототип [имя] часть

Любая помощь apprecaited благодаря

+0

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

+0

Это назначение параметров на новый объект, поэтому может» t используйте точечную нотацию. – elclanrs

+0

@elclanrs Нет, точечная нотация не может использоваться, потому что имя свойства является динамической строкой. –

ответ

3

Существует разница между obj.name и obj[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

спасибо Sime, что было полезным разъяснением –

+0

Я подключил это к firebug, и он работал, чтобы доказать вашу точку зрения, но, очевидно, я бы никогда не запустил этот код var name = 'frank' Function.prototype.method = function (name, func) { this.prototype.frank = func; верните это; }; Функция.метод («откровенный», функция (родительский) { this.prototype = new Parent(); return this; }); var Mammal = function (name) { this.name = name; } .method ('откровенного', функция() { \t возврата this.name; }) вар Кошка = функция (имя) { this.name = имя; this.saying = 'meow'; } .frank (Млекопитающее) var myCat = new Cat ('bagsley'); myCat.frank(); –

+0

@ user974959 Хм, я совсем не получил ваш последний комментарий. У вас есть другой вопрос? –

2

prototype[name] позволяет name быть переменная, содержащая любую строку, и он получит доступ к свойству prototype, названному строкой. prototype.name будет искать свойство, буквально называемое «имя».

Синтаксис [] позволяет:

  1. Есть имена переменных свойств - особенно полезно, когда цикл по свойствам с for..in
  2. использовать символы в именах свойств, которые в противном случае запрещенных
  3. (например obj['foo-bar'], arr[123].)
  4. Имеют более близкое сходство с ассоциативными массивами других языков, таких как PHP.
+0

Спасибо за ваш ответ Kolink было очень полезно Я ценю вашу обратную связь –

Смежные вопросы