创建对象有几种方法
// 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); //返回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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。