从另一个对象读取属性和调用方法Javascript Prototype Pattern

时间:2013-09-17 19:08:15

标签: javascript jquery oop prototype

我试图了解如何从其他构造函数访问属性。我想将App,Effect,Utils之类的对象和调用属性和方法从一个分隔到另一个。这可能吗,或者这种方式是完全错误的吗?

var App = function() {

    this.someProperty = 'Lorem';
    this.init();
};

App.prototype = {

    init:function(){
        this.bindEvents();
    },

    bindEvents:function(){

        var self = this;

        $(window).on('resize', function(e) {
            e.preventDefault();
            this.windowWidth = $(window).width();
            // Is that Correct?
            Utils.prototype.resizeElement(this.windowWidth);
        });

    }

};


var Utils = function(){};


Utils.prototype = {

    resizeElement: function(windowW){
        console.log(windowW);   
    },

    someMethod:function(){

        // How can i access property written in App constructor?
        console.log(this.someProperty);
    }

};


var Effects = function(){
    this.init();
};


Effects.prototype = {

    hideElement:function(ele){
        $(ele).hide();
    }

};


var app = new App();

1 个答案:

答案 0 :(得分:0)

当你上课时,课程本身并不适用。类的 Instances 就是你想要的。所以从Utils.resizeElement调用App不会做任何事情,因为resizeElement是原型的一部分(即实例获取的部分,而不是 class 本身得到)。

您需要决定是否将方法和概念分组到单个实例中,在这种情况下,您可以只使用JS对象,例如:

var Utils = {
  resizeElement: function(window) { ... }
}

如果您有一个名为Utils的对象有一个名为resizeElement的方法属性,那么您可以使用AppUtils.resizeElement调用它。

如果你真的想要一个课程,那么你有两个选择:1)将Utils实例传递给你的App或者在{App内创建一个新实例1}}。

选项1:

var App = function(utils) {
    this.utils = utils;
    this.someProperty = 'Lorem';
    this.init();
};

App.prototype = {

    init: function(){
        this.bindEvents();
        this.utils.resizeElement(...);
    }
}

var u = new Utils();
var a = new App(u);

或在内部进行

var App = function() {
    this.utils = new Utils();
    this.someProperty = 'Lorem';
    this.init();
};

App.prototype = {

    init: function(){
        this.bindEvents();
        this.utils.resizeElement(...);
    }
}