2015-03-02 116 views
0

了以下两种方式,哪种格式定义对象是很好的考虑到性能和使用情况:Javascript对象定义

//Object created with public members defined using this. 
var object1 = function() { 
    var private_i = null; 
    this.public_j = null; 

    //public function 
    this.public_func = function() { 
    } 

} 

OR

//Object created with public members defined using return patterns. 
var object2 = function() { 
    var private_i = null, 
    public_j = null, 

    //private function will be exposed from return statement. 
    _public_func = function() { 
    }; 

    return { 
    public_func : _public_func 
    }; 

} 
+0

克罗克福德建议废除'this'。 https://www.youtube.com/watch?v=PSGEjv3Tqo0 – m59 2015-03-02 07:45:18

+0

第一个更简单,处理更少。您可以尝试检查jsperf的性能。 :) – frogcoder 2015-03-02 07:46:44

+2

这2个片段不会产生相同的结果,因此它们无法比拟。 – zerkms 2015-03-02 07:47:12

回答

1

两者之间的差异与继承和使用。您的object2始终会创建直接支持Object.prototype的对象,并且不需要使用new关键字;您的object1创建的对象支持object1.prototype(反过来支持Object.prototype)和确实需要使用new

以任何客观的方式都不是“更好”,它们只是使用JavaScript的两种不同方式,它们将具有基本相同的性能。第一个是,比较常见的是,第二个是JavaScript社区中一个小但声音很小的少数派提倡的。

object1的例子是更典型地这样写的:

function Object1() { 
    var private_i = null; 
    this.public_j = null; 

    //public function 
    this.public_func = function() { 
    }; 
} 

注意,在这样的功能的第一个字母(以压倒约定)大写。

原型的东西进入它,如果你将有不需要访问private_i功能:你可以把这些对象上,将被分配到通过new Object1创建像这样的新对象:

function Object1() { 
    var private_i = null; 
    this.public_j = null; 
    //public function 
    this.public_func = function() { 
    }; 
} 
Object1.prototype.someOtherFunction = function() { 
    // Doesn't use `private_i` 
}; 

您还可以使用原型与object2,像这样:

//Object created with public members defined using return patterns. 
var object2Prototype = { 
    someOtherFunction: function() { 
     // Doesn't need private_i 
    }; 
}; 
var object2 = function() { 
    var private_i = null, 
     public_j = null, 

     //private function will be exposed from return statement. 
     _public_func = function() { 
     }; 

    var obj = Object.create(object2Prototype); 
    obj.public_func = _public_func; 
    return obj; 
};