2014-10-20 34 views
0

我看到人们在创建javascript对象时采取两种方法,他们有时会在主对象之外定义原型函数,有时他们会在内部执行它。在对象中定义原型函数具有使用私有变量和函数的优势,在外部定义它的优点是什么?在对象内部创建原型方法有什么缺点?

function something (params) { 
    this.name = params.name; 
    this.color = params.color; 
    _someprivatefunction = function() {}; 
    something.prototype.publicFunction = function() {_someprivatefunction() }; 
} 

至于反对:

function something (params) { 
    this.name = params.name; 
    this.color = params.color; 
    _someprivatefunction = function() {}; 
} 

something.prototype.publicFunction = function() {//can't call the private function here }; 

编辑:在楼下的意见建议,这是第三个选项(但现在这个问题是私有函数斜面访问的任何私人的构造函数中的变量。)

(function() { 
    function something (params) { 
    this.name = params.name; 
    this.color = params.color; 
    } 

    _someprivatefunction = function() {}; 

    something.prototype.publicFunction = function() {_someprivatefunction() }; 
}()); 
+2

第一个看起来很奇怪的我。每次创建新实例时,都会在原型级别重新定义函数。这个函数只能访问最后创建的实例的闭包变量(不管你通过哪个实例调用它)。 我在某种程度上错了吗? – 2014-10-20 04:25:04

+0

@SteveJorgensen是的,第一个选项可能是由某个人编写的不知道原型是什么,并重新定义它,每个实例的创建都是毫无意义的。如果你需要访问特定于实例的私有变量(特权函数)的功能,jsfriends解决方案(3rd)会更好。 – HMR 2014-10-20 07:13:14

回答

1

我想你知道,你的两个代码块不提供相同的功能。第一个选项允许你调用_someprivatefunction()或其他私有构造函数变量,而你的第二个选项不会。所以,首先你必须决定这是否是一项要求。您的两个选项不提供相同的功能。

如果你想访问私有函数,然后是第三个选项如下:

function something (params) { 
    // initialize data members 
    this.name = params.name; 
    this.color = params.color; 

    // initialize private members 
    var aPrivateInstanceVar = 4; 

    // define private function 
    _someprivatefunction = function() { console.log(aPrivateInstanceVar);}; 

    // define public method with access to private members and functions 
    this.publicFunction = function() {_someprivatefunction() }; 
} 

这种新的选项将在技术上的工作与您的第一选择。但是(这可能只是我的看法),它感觉更干净。它在创建时动态地将属性分配给对象,这比在对象创建时将原子分配给原型更加常见(就像分配给this.namethis.color一样)。另外,如果我遇到一些其他人写到的代码中有第一个构造的未注释的代码,我的第一个想法是:“为什么不是原型在构造函数之外完成的原型的赋值”甚至可能试图“修复”它而不知道它需要在那里。但是,如果我遇到了我提出的结构,它就像一个完全通用的设计模式,并且我不会试图“修复”代码(意外地将其破坏)。

2

我认为第一种方法的缺点是,你正在运行的每个实例化一个新的对象时,原型分配。似乎它会打败使用原型的目的,因为它对所创建的每个实例都在对象上工作。

+0

你错过了原型中的代码第一块是调用一个只在构造函数中可用的私有函数,这根本不可能在构造函数之外完成 – jfriend00 2014-10-20 04:46:05

+0

我仍然认为选项二更可取,它似乎不是一个好的设计选择来调用原型在构造函数中,为了达到相同的行为,我建议你将它包装在一个自我执行的闭包,但将私有函数移出构造函数,以便它仍然是一个私有函数,但在内部可用于原型调用。 – TGH 2014-10-20 04:50:12

+0

第二个构造不提供与第一个构造相同的功能,因为只有第一个构造才能访问构造函数中的其他每个实例私有变量。如果选择仅在1和2之间,则需要根据需要哪些功能来进行选择。我在答案中提供了第三个选项,它提供了与构造函数中的私有变量相同的访问权限,但不以这种方式使用原型(我同意你的看法,这看起来很奇怪,不合适)。 – jfriend00 2014-10-20 05:01:05

相关问题