【问题标题】:assign object and it's method to prototype [duplicate]分配对象及其原型的方法[重复]
【发布时间】:2017-07-25 09:13:25
【问题描述】:

我想将对象及其方法分配给原型,我的正常情况是这样的

var Page = function (){
    _page = {
        id: 1,
        getValue : function (){

        },

        UI :  {
            display : function (){
                console.log('display layout');
            }
        }
    }
    return _page;
}    

var mypage = new Page()
mypage.UI.display();

在我的情况下,可能有很多 Page 类的实例,所以我想用原型初始化 UI 对象,所以 UI 和它的方法可以共享给所有 Page 实例。为此,我可以使用__proto__,如下所示,

_page.__proto__.UI =  {
    display : function (){
        console.log('display layout');
    }
}

var Page = function (){
    _page = {
        id: 1,
        getValue : function (){
        
        }
        
    }
    
    _page.__proto__.UI =  {
        display : function (){
            console.log('display layout');
        }
    }
    return _page;
}    

var mypage = new Page()
mypage.UI.display();

但是这个__proto__ 已被弃用,所以有什么更好的方法可以实现这个吗?

或者

UI不需要用prototype初始化,不管Pages实例多,我们都可以正常使用,这对性能有影响吗?

【问题讨论】:

标签: javascript prototype javascript-objects prototypal-inheritance


【解决方案1】:

您应该为此使用另一种类模式,例如:

var Page = (function(glob) {
  function Page() {
     this.id = 1;
  }

  Page.prototype.method = function() { 
    // ...
  }
  return Page;
}(window))

【讨论】:

  • 为什么要关闭?
  • 为了更好地处理属性可见性,将您的孔类定义保持在一个代码范围内并注入窗口、文档等全局内容。因此,例如,如果您想在服务器端注入全局 scrope,则不能使用 window,因此当从窗口作为全局上下文切换到另一个窗口时,您不必更改对 Page 内部窗口的每次调用。
  • 但是Page 没有使用全局变量,也没有使用任何需要保持私有而否则会暴露的东西。
  • 当然 Page 本身没有,但我们知道他将使用哪些其他类。这只是在 javascript 中创建类的众多模式之一。你应该在同一个项目中使用不同的模式。因此,您必须选择适合您需要的一种。您的模式也可以,但我个人更喜欢对可见性进行更多控制,而不是直接使用全局范围。
【解决方案2】:

这样做:

function Page (){
    this.id = 1;
}    

Page.prototype.getValue = function (){

};

Page.prototype.UI = {
    display : function (){
        console.log('display layout');
    }
};

重要的是,在构造函数中不要return,而是将对象的属性分配给this,因为这是Page 的真实实例。这样就可以使用prototype 链。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2018-01-12
    相关资源
    最近更新 更多