Sen*_*lez 1 javascript function object
这只是一个简单的问题.无论哪种方式都有效.我更喜欢我的第一个例子,但我不知道这样做是否会导致分配比第二个例子更多的内存,因为我们在对象上调用"new"....
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");
Run Code Online (Sandbox Code Playgroud)
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");
Run Code Online (Sandbox Code Playgroud)
因此,在第一个示例中,我相信每次调用新帖子时都会重新创建颜色函数.如果我有100个new post();电话怎么办?效率是否低于仅仅定义一次功能的示例2?
这是否有意义我在问什么?
是的,在示例1中,对于"post"对象的每个实例都将有一个单独的"color"函数实例,而在Example 2中只有一个函数实例.显然,如果你打算有一个大的"post"对象实例的数量,然后您使用的内存超出了您的需要.
在JavaScript中,使用两个示例的最佳部分解决此问题的典型(或原型!)方法如下(请注意,我使用的是"Post",其中包含大写"P",符合构造函数的惯例与new运营商一起使用):
function Post() {
this.div = $('<div></div>');
}
Post.prototype.color = function(color) {
this.div.css({background:color});
}
var p = new Post();
p.color("#FFF");
Run Code Online (Sandbox Code Playgroud)
在对象上查找属性时(例如在我们的示例中为"p.color"),如果未在实例上直接定义属性,则将prototype其作为构造对象的函数的" " 的属性进行查找(例如"Post.prototype.color").这也意味着您可以在原型上定义实例方法,并通过直接在各个实例属性名称上分配新函数来覆盖它们(如果需要).
通过这种方式,我们仍然可以获得调用" p.color(...)" 的面向对象的语法,并且只有一个函数方法实例的好处是由所有"Post"实例共享.