Javascript 当你用自己扩展一个obj原型时会得到什么

Javascript 当你用自己扩展一个obj原型时会得到什么,javascript,jquery,Javascript,Jquery,我在看一些代码,只是为了确保我没有因为忽略了显而易见的东西而失去理智,就像我所看到的那样,没有任何收获。看起来使用$.extend()是一种浪费,但也许有人能告诉我继承中可能缺少的东西 所以,我们有这个 _letsCreateNameSpace('US.somenew.obj'); //this is based on S.stoyanov namespace pattern, what this _letsCreateNameSpace does. 然后我在一些代码中看到了这一点,但对我来说

我在看一些代码,只是为了确保我没有因为忽略了显而易见的东西而失去理智,就像我所看到的那样,没有任何收获。看起来使用$.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
 }
没有“深”延伸或任何东西。。只是看起来像是无缘无故地扩展原型的冗长方式


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

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


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

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


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

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

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

US.somenew.obj.prototype =  {
   // you lost the inheritance with `myproto`, here
}
使用
$.extend
将防止出现这种情况。另外,您不会丢失一些默认属性。例如,
构造函数

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

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

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

US.somenew.obj.prototype =  {
   // you lost the inheritance with `myproto`, here
}
使用
$.extend
将防止出现这种情况。另外,您不会丢失一些默认属性。例如,
构造函数

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

我明白了——这是有道理的,我也想到了一些东西,但我认为最初的用法应该是用于对象的“新实例化”,但这在显式名称空间声明中是不可能的。嗯,好吧,我想代码应该是多实例的,但事实似乎并非如此。好的,谢谢你的回答。我明白了——这是有道理的,我也想到了一些东西,但我认为最初的用法应该是用于对象的“新实例化”,但这在显式命名空间声明中是不可能的。嗯,好吧,我想代码应该是多实例的,但事实似乎并非如此。好的,谢谢你的回答。很棒的解释。现在它完全有道理了。我认为有必要这样做。谢谢,解释得真棒。现在它完全有道理了。我认为有必要这样做。谢谢