【问题标题】:Can an object in Javascript behave like ArrayAccess / ArrayObject in PHP?Javascript 中的对象可以表现得像 PHP 中的 ArrayAccess / ArrayObject 吗?
【发布时间】:2013-04-18 18:19:28
【问题描述】:

在 PHP 中,一个类可以实现 ArrayAccess 接口,所以可以像这样实例化和访问该类:

class MyClass implements ArrayAccess {
  protected $data = array();
  public function offsetGet($offset) {
    return isset($this->data[$offset]) ? $data[$offset] : null;
  }
  public function offsetSet($offset, $value) {
    $this->data[$offset] = $value;
  }
  public function __toString()
  {
    return print_r($this->data);
  }
}

$a = new MyClass;
$a['item'] = 10;
$a['item2'] = 'adsf';
echo $a;
// Outputs Array( 'item' => 10, 'item2' => 'adsf' )

在 Javascript 中有这样的东西吗?我希望能够在 Javascript 中创建一个迭代器类,但是可以通过使用括号符号而不是使用 get('item')/set('item2', 'asdf') 来访问这些项目,因此它可以像一个数组而不是一个对象,但仍然拥有所有我的构造函数中的函数(next、prev、is、reset 等)

我问这个是因为 AngularJS 在使用 angular.element() 时,会在 firebug 控制台中返回一个对象 (?),例如 Object [div.id1]

【问题讨论】:

  • 所以你想要一个“数组”,可以通过键访问(如对象文字),仍然有数组方法? next、prev、is、reset 等是什么?
  • 是的。接下来,prev,是,reset 是类迭代器函数,我已经添加了一些信息,为什么我在问题的底部要求这个
  • 那么你已经有一个 Javascript 类了吗?如果是的话,你能展示一下吗?

标签: php javascript


【解决方案1】:

答案是肯定的,但不是在任何打算供公众使用的应用程序中。

ECMAScript 5 支持 'get' 和 'set' 声明(在已知属性上),并且在未来的修订版中将支持代理(它可以侦听对对象的任何更改),但是如果您的应用程序要支持 IE 任何东西,或者用户不选择下载开发者浏览器并启用开发切换的任何设备,您将不得不让很多用户落后几年(考虑智能手机的合同长度,以及移动浏览器仍然不存在),或者实现旧版本并在 try-catch 子句中测试兼容性,因为使用这些功能可能会导致硬异常,或者根本不起作用,具体取决于。

因此,是的,但无论如何你都必须按照旧的方式来做。

【讨论】:

  • 我明白了,AngularJS 只在好的浏览器上这样做?我还没有在 IE 中测试过,但是 angular.element 返回一个“数组对象”
  • @pocesar 这是一个非常长的故事。但是 DOM-mutators 与 JS 代理不同,角度 DOM 元素是用 jQuery 包装的,因为 jQuery 的实体系统用于模拟不支持的浏览器的 mutators。用 jQuery 尝试一下:var el = $("#my-el"); - 它实际上不是 DOM 元素。 el[0]; 是元素。不过,您应该进一步研究 Angular 的实现——它设计得非常非常好,并且有助于一些伟大的宠物项目,学习如何实现类似的东西。
  • 很好,然后我会阅读即将发布的内容 :) ES6 看起来很有前途
  • @pocesar 如果您只是想访问它们,使用点/数组表示法(而不是设置它们),那么您可以使用 set 修改对象的附加属性:obj.set = function (name, val) { private_obj[name] = val; this.name = val; }; 您可以'不要以这种方式设置属性,但您可以访问它们,并且使用set 进行修改仍然会修改公共版本。 ...万岁的小怜悯。
猜你喜欢
  • 2015-01-30
  • 2017-08-23
  • 1970-01-01
  • 2011-02-19
  • 2014-03-16
  • 2018-04-07
  • 2013-07-04
  • 2010-09-09
  • 2021-06-23
相关资源
最近更新 更多