javascript - 创建 Javascript 对象的新实例

标签 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();

但是,如果我尝试 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);这是一个 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

关于javascript - 创建 Javascript 对象的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26828375/

相关文章:

javascript - 表单在页面加载时发送结果

java - 如何从处理程序内调用外部方法

javascript - 如果我在原型(prototype)上定义方法,如何在构造函数中调用它们?

java - 递归创建新对象是否比创建引用慢?

javascript - 从具有相同属性名称的多个表中引用列

javascript - 从reactjs构建的网页上的span标签中获取值(value)

C++:显式与隐式默认初始化

generics - 如何使用 Scala 的 Manifest 类在运行时实例化已删除的类?

python - myhdl 中的模块实例化

javascript - 在 Chrome 中创建 console.log() 的快捷方式