【问题标题】:Javascript access parent propertiesJavascript 访问父属性
【发布时间】:2013-02-13 16:13:45
【问题描述】:

如何获得家长选项?

我想访问一个全局的 myObject 选项

var myObject = {    
  method: function(){
    this.options = {};
  },      
  property: {    
    propertyMethod: function(){
       alert(this.options);
    }     
  }    
}    
myObject.method();
myObject.property.propertyMethod();

【问题讨论】:

  • 一般你不能这样做。但是如果myObject 是全局的,那么你总是可以在子对象中使用myObject.options
  • @freakish:那(略微扩展)是一个答案
  • @T.J.Crowder 是的,实际上我不是 100% 确定,所以我决定发表评论。 :)

标签: javascript


【解决方案1】:

如果您的意思是,您想从property.propertyMethod 中访问myObjectoptions 属性,那么除了利用propertyMethod 是@987654325 的闭包这一事实之外,没有其他办法。 @变量,例如:

var myObject = {    
  method: function(){
    this.options = {};
  },      
  property: {    
    propertyMethod: function(){
       alert(myObject.options); // <=== Change is here
    }     
  }    
}    
myObject.method();
myObject.property.propertyMethod();

...这通常不是一个好主意。 :-) 相反,您可能希望以不同的方式设计您的对象。例如:

var myObject = (function() {
  var obj = {
    method: function(){
      obj.options = {};
    },      
    property: {    
      propertyMethod: function(){
         alert(obj.options);
      }     
    }    
  };
  return obj;
})();
myObject.method();
myObject.property.propertyMethod();

这样,您将使用函数调用的执行上下文。但是,如果您要这样做,也许可以进行下一步:

function makeObject() {
  var obj = {
    method: function(){
      obj.options = {};
    },      
    property: {    
      propertyMethod: function(){
         alert(obj.options);
      }     
    }    
  };
  return obj;
}
var myObject = makeObject();
myObject.method();
myObject.property.propertyMethod();

...所以你可以制作多个。甚至可以创建一个真正的构造函数:

function MyObject() {
  var obj = this;

  obj.method = function(){
    obj.options = {};
  };      

  obj.property = {    
    propertyMethod: function(){
       alert(obj.options);
    }     
  };
}
var myObject = new MyObject();
myObject.method();
myObject.property.propertyMethod();

...虽然你没有利用原型,所以没有太多理由让它成为构造函数。

【讨论】:

  • 谢谢,这个解释很好,但是你会用什么方法呢?
  • @user634177:这取决于您的需求。如果您只需要其中一个对象,则可能是第二个(使用匿名 maker 函数)。如果你需要不止一个,我可能会重构一下并使用构造函数(但不是每个人都喜欢构造函数,makeObject 版本也很好)。
  • @user634177:当然,如果你不介意myObject 是全局的,你可以像第一个例子一样使用myObject。如果您的声明不在全局范围内,只需将其更改为 window.myObject = 而不是 var myObject =
【解决方案2】:

您可以使用callthis 绑定到myObject

myObject.property.propertyMethod.call(myObject);

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 2019-08-24
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2015-07-21
    • 2016-02-11
    相关资源
    最近更新 更多