Javascript如何覆盖构造函数方法?

时间:2016-01-25 02:49:24

标签: javascript oop

我有一个View类,它有一个构造函数方法initialize我认为这是一个构造函数方法,如果错误则纠正我。

var View = function(obj) {
    this.initalize = obj.initalize;
};

我希望实现的是在实例化Class时调用的东西。

我如何传递这样的对象?

var chatView = new View({
    initialize: function() {
        alert('Yay for initialization');
    }
});

因此,当我实例化View时,我可以将一个对象传递给构造函数,并且在一个键initialize中,该值是一个函数,并且在实例化时专门调用此键。

2 个答案:

答案 0 :(得分:2)

如果我做对了,有一种简单的方法可以达到你想要的效果:

var View = function(obj) {
    obj.initialize();
}

这样,只要实例化View类,就会调用initialize函数。

请注意,如果你想做真正的"初始化代码"在要使用的初始化函数中,您可以使用call(或apply):

var View = function(obj) {
    if (typeof obj.initialize === 'function') {
        obj.initialize.call(this);
    }
}

var chatView = new View({
    initialize: function() {
        this.property = 'property';
    }
});

console.log(chatView.property); // outputs property

答案 1 :(得分:0)

Javascript没有构造函数,请记住javascript是基于原型的。这是"构造函数"的一个例子。你可以创建

function Example (firstname, lastname) {
this.firstname = firstname;
this.lastname = lastname;
}

Example.prototype.getFullname = function () {
return this.firstname + ' ' + this.lastname;
}

如果要创建构造函数,必须在实例化函数后调用它。

但这是一个更好的结构,你可以使用。我建议只在你需要构造函数和私有函数时。否则,使用带有原型声明的方法的简单结构,可以获得更好的性能。

var MyObject = (function () {

    // Constructor
    function MyObject (foo) {
        this._foo = foo;
    }

    function privateFun (prefix) {
        return prefix + this._foo;
    }

    MyObject.prototype.publicFun = function () {
        return privateFun.call(this, '>>');
    }

    return MyObject;
})();


var myObject = new MyObject('bar');

使用此代码,您有一个构造函数,但它是一个"私有"函数,所以你不能在实例化对象后覆盖它。

这里我有一个链接,我创建测试不同的结构: https://plnkr.co/edit/qzgWVZlnIFnWl0MoUe5n?p=preview

结果:

测试1:~15k(带私人功能) - 仅在您需要/需要私人功能时推荐

测试2:~38k(带私人功能) - 不推荐,它返回一个非常糟糕的物体。

测试3:~8k(没有私有功能) - 推荐,它具有最佳性能,但你不能创建一个私有函数,这意味着,任何人都可以调用任何函数:S