2015-03-02 83 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; 
};