创建Javascript对象的新实例

时间:2014-11-09 12:51:14

标签: javascript class instantiation

我创建了一个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不是一个功能。

1 个答案:

答案 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是变量,而不是属性。当然,你可以把它变成一个财产;这是namedata两个属性的版本:

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调用该函数。

如果您想使用构造函数,可以使namedata属性获得重用函数的好处,而不是构建函数的新副本对于每个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
相关问题