![](https://img.haomeiwen.com/i5569035/4f87c40a81d85935.png)
![](https://img.haomeiwen.com/i5569035/f122304f46714162.png)
创建对象的三种方式:
// 字面量
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: 'o4'};
var o4 = Object.create(p)
//o4是不能直接拿到name属性的,是用原型链来连接的,o4的__proto__指向 的就是p对象
关于原型对象:
/**
* 任何函数都可以用来当做构造函数,加一个new;
* 声明一个函数时,js引擎会自动加一个prototype
**/
//打印true: o3.constructor === M.prototype.constructor === M
//打印true: o3.__proto__ === M.prototype
//如果多个构造函数增加属性或方法,会浪费空间;而原型对象的属性和方法是可以共享的,故可以利用原型对象增加属性或方法,直接通过原型链继承即可。
M.prototype.say = function(content){ console.log(content) }
o3.say('o5')
//只有函数才有prototype,实例对象是没有的
//只有实例对象才有__proto__,原型对象是没有的
//函数也有__proto__,因为函数也是一个对象, 打印true: M.__proto__ === Function.prototype
instanceOf的原理:实例对象的属性和构造函数的属性判断是不是同一个引用;但是:原型对象有可能还会有他的构造函数,instanceOf返回还是true
//打印true: o3 instanceof M
//打印true: o3 instanceof Object
//原因:
//打印true: o3.__proto__ === M.prototype
//打印true: M.prototype.__proto__ === Object.prototype
所以,用instanceof无法准确判断实例的原型是什么,如需要验证,要用constructor
//打印false: o3.__proto__.constructor === Object
//打印true: o3.__proto__.constructor === M
网友评论