【问题标题】:Function.prototype.method what is prototype[name]Function.prototype.method 什么是原型[名称]
【发布时间】:2012-05-12 21:50:34
【问题描述】:

我显然试图不重复问题,因为我已经看到了一些关于 Douglas Crockford 的 Javascript the Good part book 的问题/答案

我了解大部分代码

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 非常相似,但我仍然没有得到原型 [名称] 部分

感谢任何帮助 谢谢

【问题讨论】:

  • 它将参数分配给一个新对象,这就是为什么不能使用点符号。
  • @elclanrs 不,不能使用点表示法,因为属性名称是动态字符串。
  • 是的,我就是这么想的,只是表达了我自己的错误。 name 是一个字符串

标签: javascript oop prototype


【解决方案1】:

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

【讨论】:

  • 我把它插入了萤火虫,它证明了你的观点,但显然我永远不会运行这个代码 var name = 'frank' Function.prototype.method = function (name, func) { this.原型.坦率=功能;返回这个; }; Function.method('frank', function (Parent) { this.prototype = new Parent( ); return this; }); var Mammal = function (name) { this.name = name; }.method('frank', function () { return this.name; }) var Cat = function (name) { this.name = name; this.saying = '喵'; }.frank(哺乳动物) var myCat = new Cat('bagsley'); myCat.frank();
  • @user974959 嗯,我不太明白你最后的评论。您还有其他问题吗?
  • 没有问题,只是把你的答案付诸实践,这意味着这会起作用...... var name = 'frank' Function.prototype.method = function (name, func) { this.prototype.frank = func;返回这个; };
  • @user974959 我不明白那个代码。你为什么硬编码this.prototype.frankmethod 方法如果这样定义,将无法正常工作。它必须是this.prototype[name],以便将参数值用于名称...
  • 如果每个方法的名称都是“坦率的”,它可以,但是它不打算以这种方式工作,显然只是说明了差异以及为什么最好使用括号而不是 .notation - 只是把我学到的东西基本练习
【解决方案2】:

prototype[name] 允许name 是一个包含任何字符串的变量,它将访问由字符串命名的prototype 的属性。 prototype.name 会查找字面上称为“名称”的属性。

[] 语法允许您:

  1. 具有可变属性名称 - 在使用 for..in 循环遍历属性时特别有用
  2. 在属性名称中使用其他不允许的符号(例如obj['foo-bar']arr[123]
  3. 与 PHP 等其他语言的关联数组更相似。

【讨论】:

  • 感谢您的回答 Kolink 非常有帮助 感谢您的反馈
猜你喜欢
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 2019-12-24
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多