【问题标题】:What is the difference between myObject.someFunc = function(){...}; or myObject.prototype.someFunc = function(){...} in javascript? [duplicate]myObject.someFunc = function(){...}; 有什么区别?还是 javascript 中的 myObject.prototype.someFunc = function(){...}? [复制]
【发布时间】:2012-05-24 18:27:06
【问题描述】:

假设我在 javascript 中创建了一个对象。

var myObject = {};

和...有什么区别

myObject.someFunc = function(){...}; 

myObject.prototype.someFunc = function(){...} 

在 JavaScript 中?

我无法理解差异或是否存在差异以及如何以及何时使用这些语法。

当我编写这样的代码时,似乎真的没有区别。

我正在寻找客户端(浏览器)和服务器端(如 node.js)的答案。

我想正确准确地编码,这真的很困扰我。

【问题讨论】:

  • 请注意,prototype 属性仅对函数对象有意义,当它们用作“构造函数”时...另见:stackoverflow.com/q/2111288
  • 我想撤销我的近距离投票 - 这已经完全不同,它实际上不再是重复了。

标签: javascript


【解决方案1】:

在这种情况下:

var myObject = {};
myObject.someFunc = function(){...}; 

你所做的只是创建一个普通对象,它恰好有一个属性是对函数的引用。这通常只是为了名称间距,即将一大堆函数集中在一个公共对象下的一个地方。

但请注意,var myObject = {} 实际上并没有 prototype,因此您的第二个示例是不可能的。

对于具有原型的对象,它必须是构造函数的结果,即

function MyObject() {
    ...
}

MyObject.prototype.someFunc = function() { }

var myObject = new MyObject();
// myObject.someFunc can now be used

原型是构造函数的属性——不是该类的任何实例

如果你把函数放在原型上,那么函数对象就只有一个实例存在,并且会被类的所有实例共享。这比在每个实例上都有一个副本更节省内存。

无论代码是在浏览器中还是在服务器上,所有这些都适用 - 它仍然是同一种语言。

【讨论】:

  • Alnitak,提前道歉我是 2 周大的 js 菜鸟。我对传递给我的第一个示例中的方法(我相信称为静态)、类实例的方法以及作为原型示例完成的方法的变量范围感到困惑?在前两种情况下,变量有自己的范围,我们应该说是安全的。在原型示例中,如果所有实例共享同一个函数,这是否意味着传递给方法/函数的变量具有共享范围,因此可以相互覆盖(假设它们不应该)。这上面有一个 SO 线程,但我找不到它。
  • 哦,是的,而且比你好心。
【解决方案2】:

本质上,这表示一个静态方法(或仅附加到该对象的方法(在本例中为 myObject):

myObject.someFunc = function () {...};

这表示附加到对象原型的方法(实例方法):

myObject.prototype.someFunc = function () {...};

【讨论】:

  • 如果你要-1,至少留下评论。这个答案没有错。它与 JS 的原型继承模型相比,与大多数程序员更熟悉的常见 OOP 思想进行了类比。
  • 你答案的前半部分是正确的,但后半部分是不正确的并且具有误导性。 myObject.prototype 不是一回事。您要么是指构造函数的 .prototype 属性,要么是指支持它的 JS 环境中的 myObject.__proto__。出于同样的原因,@ryan 的回答是错误的。
【解决方案3】:

myObject.someFunc = function(){...} 是该函数的一次性实例,其返回值被分配给 myObject 的 someFunc 属性。

myObject.prototype.someFunc = function(){} 实际上是在创建一个可以在 myObject 上的任何位置调用的方法,并且每次都会更改相同的值实例。

myObject.prototype.someFunc = function(num){
    this.num_to_be_stored = num;
}

将更改 num_to_be_stored 的值,而不是 someFunc 的值,这是在第一个实例中发生的情况。

编辑:对不起,清晨不清楚我想说什么。

【讨论】:

  • 嗯,共享返回值,嗯,什么?!
  • 很抱歉,但仍然完全不清楚您想说什么。
  • 你说的和我一样。干杯。
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2012-02-18
  • 2016-10-14
  • 2019-02-18
  • 2017-04-28
  • 2012-07-12
  • 1970-01-01
相关资源
最近更新 更多