1.原型链类
创建对象有几种方法 → 原型、构造函数、实例、原型链 → instanceof 的原理 → new 运算符
1.1 创建对象的方式
一、字面量方式创建
1 | var obj = { |
二、通过构造函数创建
1 | function Person(name,age){ |
三、Object.create
1
2
3
4
5
6
7var Person = {
name : "Beme",
age : 21,
run: function(){
alert("I like running");
}
}
然后,直接用Object.create()
生成实例,不需要用到new。
1 | var p1 = Object.create(Person); |
这种方法比”构造函数法”简单,但是不能实现私有属性和私有方法,实例对象之间也不能共享数据,对”类”的模拟不够全面。
1.2 原型、构造函数、实例、原型链
注:图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线。
1.3 instanceof
的原理
1 | function Person(name) { |
为什么 Beme instanceof Object
结果为true
呢?
1 | 因为:Beme.__proto__===Person.prototype; |
1 | A instanceof B 验证A对象是不是B类的实例。 |
我们用constructor
来判断比用instanceof
更严谨:1
2
3
4
5function Person(name) {
this.name=name;
};
var Beme=new Person('Beme');
console.log(Beme.__proto__.constructor===Person);//true
1.4 new
运算符
首先,一个新对象被创建。它继承自foo.prototype
。然后,构造函数foo
被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new foo
等同于new foo()
,只能用在不传递任何参数的情况。最后,如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象。
1 | var new1=function (func) { |
2. 面向对象类
类与实例(类的声明、生成实例) → 类与继承(如何实现继承、继承的几种方式)