javascript中对象字面量方式创建对象,不会调用Object构造函数吗

javascritp高级程序设计中说:在通过对象字面量定义对象时,实际不会调用Object构造函数。 那这个对象是怎么创建出来的?
之前有人提过这个问题,但我看了下答案,还是云里雾里的,谁能帮我解释下,谢谢了

阅读 2.6k
1 个回答

既然邀请了, 我就说下我的理解吧, 不一定正确:

  1. 构造函就是一个函数, 没什么特殊的.
  2. 对象在执行构造函数之前就已经创建了, 如果构造函没干什么, 不执行又能怎么呢?

看这个例子:

//定义一个类型
function Class(){} //构造函数什么也不干
Class.prototype = {
    name: 'class', 
    showName:function(){ 
        console.log(this.name) 
    }
}

// 正常实例化Class 是这样的:
// var a = new Class();

// 其实我们可以这样做
var a = {};
a.__proto__ = Class.prototype;
Class.call(b);  // Class 函数什么也没干所以可以不要这一行.

a instanceof Class; //true
__proto__ 其实就是 javascript 中常说的 原型链 (__proto__这个名字, 虽然不在标准定义中, 但现在的JS引擎都是这么实现原型链的, 这么用比较直观);

回来说说字面量 定义对像:

var k = {}; // Js 引擎把`{}`解析为对像(并不是构建函数), 并把这个对像的 `__proto__` 指向 `Object.prototype`;
k.__proto__ == Object.prototype //true;
k instanceof Object; //true;

k.__proto__ = null; 
k instanceof Object; //false;

// 这时候 k 还是可以使用的, 只是没了 'toSting'等那些正常对像都会有的方法, 因为这些方法都在`Object.prototype` 上
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏