创建对象有几种方法
// 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();
原型、构造函数、实例、原型链的关系
几点说明:
- 函数声明时自动增加prototype属性,初始化一个空对象
- 构造函数才会有prototype,普通函数会有__proto__
- 实例对象才会有__proto__
继承
工作原理:通过原型链的方式找到原型对象,原型对象的方法和属性会共享;实例没有的属性会向上查找
instanceof的原理
判断原理:实例对象的__proto__属性和构造函数的prototype属性是不是引用同一个地址,而且实例对象的constructor必须指向对应构造函数
var a = [1, 2, 3];alert(a instanceof Array); //返回truealert(a instanceof Object); //返回true alert(a.constructor == Array); //返回truealert(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);