创建对象的方法
-
var o1={name:'o1'};
var o2=new Object({name:'o2'})
-
var b=function(name){this.name=name}
var b1=new b('o3');
-
var c={name:'p'}
var o4=Object.create(c);
原型、构造函数、实例、原型链
只要是对象,就是实例
构造函数、原型对象、实例三者的关系
instanceof
原理:判断实例对象的_proto_属性和构造函数的prototype属性是否为引用同一个地址
new运算符
- 一个新对象被创建。继承自foo.prototype
- 构造函数foo被执行。执行时,相应的而传参会被传入,同时上下文(this)会被指定为这个新实例。new foo等同于new foo(),只能用在不传递任何参数的情况
- 如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤一创建的对象。
// 模拟new运算符
var new2=function(num){
var o=Object.create(num.prototype)
var result =num.call(o)
if(typeof result==='object'){
return result
}
else{
return o
}
}
//输出结果
> o6=new2(M)
< M {name: undefined}
> o6 instanceof M
< true
> o6 instanceof Object
< true
> o6.__proto__.constructor===M
< true
> o6.__proto__.constructor===Object
< false