什么's在对象内部创建原型方法的缺点
What's the disadvantage of creating prototype methods inside the object?
我见过人们在创建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() };
}());
我认为第一种方法的缺点是,每次实例化新对象时都要运行原型分配。似乎它会破坏使用原型的目的,因为它确实为创建的每个实例处理对象。
正如我所知,您的两个代码块不提供相同的功能。第一个选项允许您调用_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.name
和this.color
一样)。
此外,如果我遇到别人写的一些未注释的代码,其中包含了你的第一个构造,我的第一个想法是:"天哪,为什么不在构造函数之外完成原型的赋值呢?"我甚至可能试图"修复"它,而没有意识到它需要在那里。但是,如果我遇到了我提出的结构,它会像一个非常常见的设计模式,我不会试图"修复"代码(在这个过程中意外地破坏了它)。
相关文章:
- 创建对象函数原型和代码是错误的
- 创建后指定对象原型
- 什么是“;原型;通过JavaScript中的Object Literal Notation创建的对象的链接
- ES6 const,用于在JavaScript中创建对象原型;这是一种模式吗
- 哪个原型用于创建具有未知标记的节点
- 使用闭包创建原型中引用的私有属性
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 动态创建原型并推送到数组
- 不创建父对象的原型继承
- 创建所有原型函数均可访问的局部变量
- 挂钩文档.使用函数原型创建元素
- 在Vanilla Javascript中使用窗体中的对象原型创建多个用户
- 如何在 JavaScript 中从原型创建对象
- 如何使用原型创建基元包装器对象
- 如何在javascript中调用通过原型创建的方法
- JavaScript:基于原型创建继承函数
- 你能在JavaScript中使用自定义原型创建函数吗?
- 如果我使用原型创建OOP JS代码,我如何从循环中引用类方法
- 用原型创建嵌套属性是一个好的实践吗?以及如何正确地做到这一点
- 使用原型创建带有方法的数组