我创建了一个 JavaScript 对象,我想在每次用户调用该对象时实例化一个新对象。但是我不确定执行此操作的正确方法。以下是我尝试过的:
JavaScript 对象
var parent = (function (){
var name = null;
var data = [];
return{
initialize: function(){
alert('Hi i am a Parent');
},
setName: function (aName){
this.name = aName;
},
getName: function(){
return this.name;
},
sayHello:function(name){
alert('Hi good morning ' + name);
}
};
})();
我想创建这个对象的一个新实例并调用它的函数。
这有效parent.initialize();
但是,如果我尝试 varfather = newparent()
我得到 parent(
) is not a constructor
如果我尝试 varfather = new Object()
我得到 father.initialize
is not a function.
最佳答案
你所拥有的(如果你删除function
后面的)
)将导致parent
引用一个对象,而不是一个函数。您可以通过将其设为函数来解决此问题:
function createParent(){
var name = null;
var data = [];
return{
initialize: function(){
alert('Hi i am a Parent');
},
setName: function (aName){
name = aName; // <== No `this.` here
},
getName: function(){
return name; // <== Or here
},
sayHello:function(name){
alert('Hi goof morning ' + name);
}
};
}
var parent1 = createParent(); // Create a parent
var parent2 = createParent(); // Create another parent
parent1.initialize(); // Call initialize on parent1
parent2.initialize(); // Call initialize on parent1
那(工厂函数)是在 JavaScript 中创建对象的常见习惯用法之一。
请注意,我还删除了其中一些不正确的 this.
:您的 name
是一个变量,而不是一个属性。当然,你可以将其设为属性(property);这是一个 name
和 data
都是属性的版本:
function createParent(){
return{
name: null,
data: [],
initialize: function(){
alert('Hi i am a Parent');
},
setName: function (aName){
this.name = aName;
},
getName: function(){
return this.name;
},
sayHello:function(name){
alert('Hi goof morning ' + name);
}
};
}
var parent1 = createParent(); // Create a parent
var parent2 = createParent(); // Create another parent
parent1.initialize(); // Call initialize on parent1
parent2.initialize(); // Call initialize on parent1
另一个常见的习惯用法是构造函数,它的形式略有不同,并且总是通过new
而不是直接调用:
function Parent(){
var name = null;
var data = [];
this.initialize = function(){
alert('Hi i am a Parent');
};
this.setName = function (aName){
name = aName;
};
this.getName = function(){
return name;
};
this.sayHello = function(name){
alert('Hi goof morning ' + name);
};
}
var parent1 = new Parent(); // Create a parent
var parent2 = new Parent(); // Create another parent
parent1.initialize(); // Call initialize on parent1
parent2.initialize(); // Call initialize on parent1
对于构造函数(传统上其名称以大写字母开头),new
运算符会为您创建对象,然后使用引用该对象的 this
来调用该函数新对象。
如果您想使用构造函数,您可以使 name
和 data
属性和获得重用函数的好处,而不是为每个 Parent
实例构建函数的新副本:
function Parent(){
this.name = null;
this.data = [];
}
Parent.prototype.initialize = function(){
alert('Hi i am a Parent');
};
Parent.prototype.setName = function (aName){
this.name = aName;
};
Parent.prototype.getName = function(){
return this.name;
};
Parent.prototype.sayHello = function(name){
alert('Hi goof morning ' + name);
};
var parent1 = new Parent(); // Create a parent
var parent2 = new Parent(); // Create another parent
parent1.initialize(); // Call initialize on parent1
parent2.initialize(); // Call initialize on parent1
关于javascript - 创建 Javascript 对象的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26828375/