0

我正在查看一些代码,只是为了确保我不会因为错过显而易见的事情而失去理智,因为这对我来说似乎没有任何收获。似乎是对 $.extend() 的浪费使用,但也许有人可以阐明我在继承中可能遗漏的一些东西。

所以,我们有这个。

_letsCreateNameSpace('US.somenew.obj');
//this is based on S.stoyanov namespace pattern, what this _letsCreateNameSpace does.

然后我在一些代码中看到了这一点,这对我来说没有意义。

US.somenew.obj = function(){
  // some this var assignments.
  this.blah = $foo;
}

// this usage of extend escapes me. I don't see a need at this point here.
$.extend(US.somenew.obj.prototype, {
  // a bunch of new methods


}

我完全看不到使用 $.extend() 而不是以下内容的好处,因为除了它本身之外没有任何扩展。

 US.somenew.obj.prototype = {
   // a bunch of new methods
 }

没有“深度”扩展或任何东西..看起来像是无缘无故扩展原型的冗长方式。

我错过了什么吗?我在这里缺少一些“树后的森林”方法吗?

4

2 回答 2

3

$.extend将复制到prototype给定的方法而不覆盖prototype对象本身。例如,如果您有:

// inheritance
US.somenew.obj.prototype = myproto;

US.somenew.obj.prototype =  {
   // you lost the inheritance with `myproto`, here
}

使用$.extend将防止这种情况。另外,您不会丢失一些默认属性。例如,constructor

US.somenew.obj = function () {};

US.somenew.obj.prototype = {};

var o = new US.somenew.obj();

console.log(o.constructor === US.somenew.obj) // false, in that case is `Object`

在哪里:

US.somenew.obj = function () {};

$.extend(US.somenew.obj.prototype, {});

var o = new US.somenew.obj();

console.log(o.constructor === US.somenew.obj) // true
于 2013-04-06T01:11:27.430 回答
1

我认为唯一的好处是保持原始原型对象完好无损,而不是用新对象覆盖它。
constructor属性将引用正确的函数 ( US.somenew.obj) 而不是引用Object. 当然,您可以.prototype.constructor正确地重新分配(并且经常这样做),但是您可以通过扩展现有对象来避免这种情况。

从编码风格的角度来看,这似乎也很有意义:通常您不想替换原型,而是想为其添加属性。

于 2013-04-06T01:08:58.433 回答