在javascript中为对象创建函数
据我所知,在javascript中为对象创建函数有两种主要方法。它们是: 方法A,在构造函数中设置它:在javascript中为对象创建函数,javascript,Javascript,据我所知,在javascript中为对象创建函数有两种主要方法。它们是: 方法A,在构造函数中设置它: function MyObject() { this.myFunc1 = function() { ... } this.myFunc2 = function() { ... } ... } 方法B,将其添加到原型中: function MyObject() { ... } MyObject.prototype
function MyObject() {
this.myFunc1 = function() {
...
}
this.myFunc2 = function() {
...
}
...
}
方法B,将其添加到原型中:
function MyObject() {
...
}
MyObject.prototype.myFunc1 = function() {
...
}
MyObject.prototype.myFunc2 = function() {
....
}
显然,如果你这样做了:
MyObject.myFunc3 = function() {
....
}
然后myFunc3
将与MyObject本身关联,而不是使用new
关键字创建任何新对象。为了清楚起见,我们将其称为方法C,即使它不适用于使用new
关键字创建新对象
因此,我想知道两者之间的区别是什么。据我所知,它们在逻辑上具有相同的效果,即使机器上发生的情况不同
如果我猜的话,我会说唯一真正的区别是当你在构造函数中定义它们时,就像在方法A中一样,它会为每个创建的对象创建一个全新的函数对象,而方法B只保留它的一个副本(在MyObject中),它在任何时候被调用都会引用。如果是这样的话,你为什么要用一种方法而不是另一种方法呢。否则,方法A和方法B之间的区别是什么。为每个对象提供单独的函数的优点是,您可以关闭构造函数中的变量,基本上允许“私有数据” vs
这是不是一个好主意取决于你问谁。我个人的立场是在实际使用原型时保留构造函数,如选项2,在使用闭包时使用普通函数(例如,
使我的对象(a,b)
),如选项1。想法是您可以随时修改原型和该类型的所有对象(即使是在修改之前创建的对象)将继承更改。这是因为,正如您所提到的,原型不会随每个新实例一起复制。方法A中的MyObject
是内部函数的实例。
除非对象(可以称之为类)被实例化,否则不能在对象外部显式调用其函数
假设:
MyObject.MyFunc1(); // will not work
var obj = new MyObject();
obj.MyFunc1(); // will work
所以这和其他语言中的任何类都是一样的。不过,描述类的有用性及其用法超出了这个问题
另请注意:
function MyObject() {
var privateVar = "foo";
this.publicProperty = "bar";
// public function
this.publicFunc = function() {
...
}
// private function
function privateFunc () {
...
}
}
对于方法B而言,与方法A相同,唯一的区别在于原型设计是一种创建对象的风格。有些人出于可读性或偏好而使用原型。
原型的主要优点是可以扩展现有对象,而无需接触原始源。不过你得小心点。
(作为示例原型框架)
对于方法C,您可以将它们称为静态函数。正如您所说的,可以通过如下对象引用来显式调用它们:
MyObject.MyFunc1();
因此,使用哪种方法取决于您所处理的情况。您也可以在对象中创建函数,如read about the module pattern:@CoreyFarwell,我假设它与方法A的作用基本相同,是吗?在方法B中,方法也是实例方法。你有没有被他的假想和未标记的“方法C”搞混了?没有,我明白你的意思了。我明确地将其标记为方法c,即使它对于使用
new
关键字创建新对象并不起作用。@missingno是的,对不起。不知怎的,我眼前一亮。正确答案
function MyObject() {
var privateVar = "foo";
this.publicProperty = "bar";
// public function
this.publicFunc = function() {
...
}
// private function
function privateFunc () {
...
}
}
MyObject.MyFunc1();