我创建了一个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();
但是,如果我尝试var father = new parent()
我得到parent(
)不是构造函数
如果我尝试var father = new Object()
我得到father.initialize
不是一个功能。
答案 0 :(得分:1)
您拥有的内容(如果您在)
之后删除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
是变量,而不是属性。当然,你可以把它变成一个财产;这是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