创建对象有几种方法

// 1.字面量
var o1 = {
    name: 'o1'
};
var o2 = new Object({
    name: 'o2'
});
// 2.Object.create()
var o3 = Object.create({
    name: 'o3'
});
// 3.构造函数
var M = function () {
    this.name = 'o3'
};
var o4 = new M();

image

原型、构造函数、实例、原型链的关系

image

几点说明:

  • 函数声明时自动增加prototype属性,初始化一个空对象
  • 构造函数才会有prototype,普通函数会有__proto__
  • 实例对象才会有__proto__

继承

工作原理:通过原型链的方式找到原型对象,原型对象的方法和属性会共享;实例没有的属性会向上查找

instanceof的原理

image

判断原理:实例对象的__proto__属性和构造函数的prototype属性是不是引用同一个地址,而且实例对象的constructor必须指向对应构造函数

var a = [1, 2, 3];
alert(a instanceof Array);  //返回true
alert(a instanceof Object);  //返回true
 
alert(a.constructor == Array);  //返回true
alert(a.constructor == Object);  //返回false

constructor 更加精确地指向对象所属的类,而对 instanceof 而言,即使是父类也会返回true

练习:如何判断一个对象是否属于某个类

if(a instanceof Person){
    alert('yes');
}

new运算符(过程、工作原理)

1.创建一个空对象,并且this变量指向改对象,同时还继承了该构造函数的原型
2.属性和方法被加入到this引用的对象中去
3.最后隐式的返回this对象
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

Hayley
220 声望9 粉丝

人生因选择而不同,因坚持而精彩