(译)ECMAScript 5 Objects and Properties (二)

本文介绍了 ECMAScript5 引入的一些新特性,包括 Object.keys 和 Object.getOwnPropertyNames 方法来获取对象的所有属性名,Object.create 方法来创建新对象并指定其原型,以及 Object.seal 方法来密封对象。

继  

   (译)ECMAScript 5 Objects and Properties 

   全文地址 http://ejohn.org/blog/ecmascript-5-objects-and-properties/

   @by Aaron

新功能

新增加一些有趣的新特性已经被引入到语言

以下两个方法是非常有用的,用于收集所有的属性的数组对象。

Object.keys( obj )

将会返回一个字符串格式的数组表示所有可枚举的对象属性名,相同方法的一个实现

代码实现:

Object.keys = function( obj ) {
  var array = new Array();
  for ( var prop in obj ) {
    if ( obj.hasOwnProperty( prop ) ) {
      array.push( prop );
    }
  }
  return array;
};

示例用法:

var obj = { name: "John", url: "http://ejohn.org/" };
 
print( Object.keys(obj).join(", ") );
// name, url

 

Object.getOwnPropertyNames( obj )

几乎所有用Objet.keys返回对象的所有属性名(不只是可枚举的的)

 

Object.create( proto, props )

创建一个新对象的原型是等于值的原型并通过对象的属性设置 Object.defineProperties( props ).

示例实现

Object.create = function( proto, props ) {
  var ctor = function( ps ) {
    if ( ps )
      Object.defineProperties( this, ps );
  };
  ctor.prototype = proto;
  return new ctor( props );
};

另外的实现:

Object.create = function( proto, props ) {
  var obj = new Object();
  obj.__proto__ = proto;
 
  if ( typeof props !== "undefined" ) {
    Object.defineProperties( obj, props );
  }
 
  return obj;
};

说明:

  以上代码可以用mozilla特定原型属性,这个属性允许您访问一个对象的内部原型-并且允许你设置它的值,同样,ECMA5的方法Object.getPrototypeOf也允许你访问这个值,但是不能过设置这个值-因此上述方法不能实现一个通用的、规范兼容的方式

 

示例用法:

function User(){}
User.prototype.name = "Anonymous";
User.prototype.url = "http://google.com/";
 
var john = Object.create(new User(), {
  name: { value: "John", writable: false },
  url: { value: "http://google.com/" }
});
 
print( john.name );
// John
 
john.name = "Ted"; // Exception if in strict mode

 

Object.seal( obj )
Object.isSealed( obj )

 

 

转载于:https://www.cnblogs.com/aaronjs/p/3139448.html

### 关于严格模式下的 `TypeError` 错误 在 JavaScript 的严格模式 (`strict mode`) 下,尝试访问某些特定的属性会引发错误。具体来说,当代码运行在严格模式下时,无法访问函数的 `caller` 和 `callee` 属性以及 `arguments` 对象的相关特性[^1]。 #### 原因分析 此问题的根本原因在于 ECMAScript 5 中引入了严格模式的概念,目的是为了减少一些不安全的操作并提高性能。在这种模式下,JavaScript 引擎会对代码执行更严格的检查,其中就包括对 `caller`、`callee` 和 `arguments` 特性的限制[^2]。 如果开发者试图通过这些受限特性和方法来操作代码逻辑,则会在运行时抛出类似于以下的错误消息: ``` Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them. ``` 这种行为是为了防止潜在的安全隐患和不可预测的行为发生。 #### 解决方案 以下是几种常见的解决办法: 1. **避免使用受限制的属性** 需要重构代码以移除对 `caller` 或 `callee` 的依赖。可以通过其他方式实现相同的功能而不违反严格模式的规定。例如,在递归场景中可以显式传递函数本身作为参数而不是依靠隐式的 `callee` 参考[^3]。 2. **禁用严格模式 (不推荐)** 虽然可以直接关闭严格模式从而绕过这个问题,但这并不是最佳实践,因为这样可能会重新引入那些被设计用来规避的风险因素。不过对于调试目的或者遗留系统的兼容性考虑,可以在局部范围内取消启用严格模式: ```javascript function nonStrictFunction() { // 此处未声明 "use strict" var calleeExample = arguments.callee; // 不再触发错误 } ``` 3. **更新第三方库版本** 如果问题是由于使用的外部库(如 MUI.js)引起的,则应该查看该库是否有新版本发布解决了这一冲突情况。通常情况下升级到最新稳定版能够修复已知缺陷[^4]。 4. **调整构建工具配置** 在现代前端开发环境中,可能还需要审查 Webpack/Babel 等打包器设置是否正确处理了目标环境的要求。有时降级 ES 版本输出可以帮助避开此类兼容性难题。 ```javascript // 示例:Babel 配置文件 .babelrc 修改部分选项 { "presets": [ ["@babel/preset-env", { "targets": { "esmodules": true } }] ] } ``` 以上措施均有助于缓解由严格模式导致的类型错误状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值