2012-05-24 73 views
2

假设我在javascript中创建了一个对象。myObject.someFunc = function(){...};有什么区别?或myObject.prototype.someFunc = function(){...}在JavaScript中?

var myObject = {}; 

之间有什么区别...

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

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

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

看来,当我编写这样的代码时,确实没有什么区别。

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

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

+3

注意'prototype'属性仅对函数对象有意义的,当它们被用作“建设者” ...参见:http://stackoverflow.com/q/2111288 – CMS

+0

@CMS分毫不差 – Alnitak

+0

我想撤销我的近距离投票 - 这已经结束不同之处在于它实际上不再是重复的。 – Alnitak

回答

3

在这种情况下:

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

所有你正在做的是创建一个普通的对象,这恰好有一个属性是一个函数的引用。这通常是为了名称间隔而完成的,即将共同对象下的一个地方的整个负载函数分组。

但是请注意,var myObject = {}实际上没有prototype所以你的第二个例子是不可能的。

对于一个目的是有原型它必须是一个构造函数的结果,即

function MyObject() { 
    ... 
} 

MyObject.prototype.someFunc = function() { } 

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

原型是构造函数的特性 - 没有这个类的任何实例的。

如果将函数放在原型上,则只有函数对象的一个​​实例存在,并且将被该类的所有实例共享。这是更有效的内存,每个实例上都有一个副本。

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

+0

Alnitak,提前道歉我是一个2周龄js noob。我对第一个例子中传递给方法的变量的范围(我相信称为静态),类方法和作为原型例子的方法感到困惑?在前两种情况下,变量有其自己的范围,我们应该说是安全的。在原型示例中,如果所有实例共享相同的函数,那么这是否意味着传递给方法/函数的变量具有共享范围,因此可能会彼此重叠(假设它们不应该)。这里有一个SO线程,但我找不到它。 –

+0

哦,是的,比你非常善良。 –

0

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,这是第一次发生的情况。

编辑:抱歉清晨不清楚我想说什么。

+0

嗯,共享返回值,嗯,什么?! – Alnitak

+0

对不起,但仍然完全不清楚你想说什么。 – Alnitak

+0

你得到的是同样的东西。干杯。 – doogle

0

本质上讲,这表示一个静态方法(或在这种情况下连接至仅该对象(myObject的一种方法):

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

这表示连接到对象(一个实例方法)的原型的方法:

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

如果你打算-1,至少发表评论。这个答案没有错。它比较了大多数程序员对JS的原型继承模型更熟悉的常见OOP思想。 – doogle

+0

答案的前半部分是正确的,但下半部分是错误的和误导性的。 'myObject.prototype'不是问题。您或者是构造函数的'.prototype'属性,或者您是指支持它的JS环境中的'myObject .__ proto__'。 @ ryan的回答由于同样的原因是错误的。 – jimbojw

相关问题