imooc(三)

1.原型链类

创建对象有几种方法 → 原型、构造函数、实例、原型链 → instanceof 的原理 → new 运算符

1.1 创建对象的方式

一、字面量方式创建

1
2
3
4
var obj = {
name : 'Beme',
age : 21
};//分号最好加上

二、通过构造函数创建

1
2
3
4
5
6
7
function Person(name,age){
this.name=name;
this.age=age;
}

var boy=new Person('小明',12);
var girl=new Person('小红',10)

三、Object.create

1
2
3
4
5
6
7
var Person = {
name : "Beme",
age : 21,
run: function(){
alert("I like running");
}
}

然后,直接用Object.create()生成实例,不需要用到new。

1
2
3
var p1 = Object.create(Person);
alert(p1.age);//21
p1.run();//I like running

这种方法比”构造函数法”简单,但是不能实现私有属性和私有方法,实例对象之间也不能共享数据,对”类”的模拟不够全面。

1.2 原型、构造函数、实例、原型链

JavaScript学习总结(五)原型和原型链详解

image

:图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线。

1.3 instanceof 的原理

1
2
3
4
5
6
function Person(name) {
this.name=name;
};
var Beme=new Person('Beme');
console.log(Beme instanceof Person); //true
console.log(Beme instanceof Object); //true

为什么 Beme instanceof Object结果为true呢?

1
2
因为:Beme.__proto__===Person.prototype;
Person.prototype.__proto__===Object.prototype
1
2
A instanceof B   验证A对象是不是B类的实例。
A instanceof B, 不能证明A是new B()出来的,因为可能是继承。

我们用constructor来判断比用instanceof更严谨:

1
2
3
4
5
function 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
2
3
4
5
6
7
8
9
var new1=function (func) {
var o=Object.create(func.prototype);
var k=func.call(o);
if (typeof k === 'object') {
return k;
}else {
return o;
}
};//new1 的工作原理和new的原理一样。

2. 面向对象类

类与实例(类的声明、生成实例) → 类与继承(如何实现继承、继承的几种方式)

JavaScript继承方式详解

原型和原型链详解

------ 本文结束 ------
0%