一、创建对象

// 第一种方式:字面量
      var o1 = {name: 'o1'};
      var o2 = new Object({name: 'o2'});
      // 第二种方式:构造函数
      var M = function (name) { this.name = name; };
      var o3 = new M('o3');
      // 第三种方式:Object.create
      var p = {name: 'p'};
      var o4 = Object.create(p);

 

二、原型链

对于原型链,自己了解的一直有些晕乎,最近刚好看到一个课程,讲的比较清楚,自己在此也做一些总结,巩固知识。

(图片是抄的,嘻嘻,截自慕课网的一个课程)

构造函数通过new生成一个实例;构造函数本身是一个函数,函数都会有prototype属性,这是声明函数时,js引擎自动加的;原型对象为了区分是哪个构造函数,因此有一个constructor属性指向该构造函数;而实例的_proto_又指向构造函数的原型对象。

下面是通过构造函数的方式创建一个对象,帮助理解原型对象、实例、构造函数之间的关系

 var M=function (name) {
        this.name=name;
    }
    var o3=new M('o3');

 原型链:从一个实例对象往上找构造这个实例的相关联的对象,这个相关联的对象再往上找,又有构造它的对象,以此类推,一直到Object.protype

三、instanceof原理

如果一个构造函数B的prototype在实例对象A的原型链上,那么 A instanceof B就为true(也就是说A.__proto__与B.prototype指向同一个引用)

 var M = function (name) { this.name = name; };
 var o3 = new M('o3');

  

也就是说如果a继承了b,b又继承了c,那么a instanceof c也是true。

如果要判断一个实例对象是不是直接由某一个构造函数生成的,更加严谨的做法是使用constructor