javascript:方法的独立函数还是嵌入在对象中?

问题描述:

这只是一个简单的问题。无论哪种方式工作。我喜欢我的第一个例子,但我不知道做这种方式会导致更多的内存比第二个例子,因为我们调用对象的“新”被分配....javascript:方法的独立函数还是嵌入在对象中?

例1

var post = function(){ 
    var self = this; 
    self.div = $('<div></div>'); 
    self.color = function(color){ 
    this.div.css({background:color}); 
    } 
} 

var p = new post(); 
p.color("#FFF"); 

例2

var post = function(){ 
    self = this; 
    self.div = $('<div></div>'); 
} 

var color = function(p, color){ 
    p.div.css({background:color}); 
} 

var p = new post(); 
color(p, "#FFF"); 

所以,在第一个例子中,颜色的功能相信会得到重新每次一个新的职位被调用。如果我有100 new post();电话会怎么样?是否比示例2的效率低,其中函数只定义了一次?

这有道理我在问什么?

是的,在示例1中,对于“post”对象的每个实例都会有一个单独的“color”函数实例,而在示例2中只有该函数的一个实例。很明显,如果您计划有大量的“后”对象实例,那么你使用的内存比你需要的多。

在JavaScript中,使用您的两个示例的最佳部分解决此问题的典型(或原型!)方式如下所示(请注意,我按照约定使用大写“P”的“Post”的意图用于使用与所述运营商new构造函数):

function Post() { 
    this.div = $('<div></div>'); 
} 

Post.prototype.color = function(color) { 
    this.div.css({background:color}); 
} 

var p = new Post(); 
p.color("#FFF"); 

当寻找一个对象的属性(在我们的例子中,例如“p.color”),如果该属性没有定义直接那么它会被查找为构造该对象的函数(例如“Post.prototype.color”)的“prototype”的属性。这也意味着您可以在原型上定义实例方法,并通过直接在各个实例属性名称上分配新函数来覆盖它们(如果需要)。

这样我们仍然可以获得很好的面向对象的语法调用“p.color(...)”,并且只有一个函数方法实例的好处是所有“Post”实例共享。

+1

这是你的原型。很好的解释和解决方案,+1。 – bernie 2012-03-25 15:16:28

+0

“Post”中如何有“原型”属性?为什么我们不需要像Post.prototype = {};我们可以使用它之前? (没有人这样做,我只是想知道这是如何工作的) – 2012-03-25 15:17:44

+1

@Danny Milosavljevic:http://es5.github.com/#x13.2,第18步。 – pimvdb 2012-03-25 15:21:44