ECMAScript5 Objects and Properties

ESMA5 各浏览器兼容表


看了这两篇关于介绍ECMA5新加的操作Object和属性的API文章,看了这2篇那对这API就了如指掌了。

john resig -- ECMAScript 5 Objects and Properties

IBM developerworks -- 深入探讨 ECMAScript 规范第五版


了解到关于Object.create()的几种实现方法:

第一种:

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;
};

第三种:

Object.create = function(O) {  
  function F() {};  
  F.prototype = O;  
  return new F();  
} 


使用Object.create();
var a = {};  
var b = Object.create(a);  
var c = Object.create(b);  
a.x = 1;  
b.y = 2;  
c.z = 3;  
  
function Fn_1() {  
}  
  
function Fn_2() {  
}  
  
Fn_1.prototype = b;  
Fn_2.prototype = c;  

var rslt = new Fn_2();

for(var i in rslt){
  console.log(rslt[i]);
}
// 依次输出: 3 2 1;

例子中生成的原型链就是这个样子:


"通过这个create方法,我们可以创建任意的、足够长的原型链,然后把它“赋值给”某个构造器函数,使“原型链创建过程”与“构造器中的初始化过程”二者分解开来。"

这句话出自:前端要给力之:分解对象构造过程new()


### 关于严格模式下的 `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、付费专栏及课程。

余额充值