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。 – bernie 2012-03-25 15:16:28
“Post”中如何有“原型”属性?为什么我们不需要像Post.prototype = {};我们可以使用它之前? (没有人这样做,我只是想知道这是如何工作的) – 2012-03-25 15:17:44
@Danny Milosavljevic:http://es5.github.com/#x13.2,第18步。 – pimvdb 2012-03-25 15:21:44