new
new运算符接受一个函数F及其参数:new F(arguements...)。这一过程分成三步:
- 创建类的实例。这不是是把一个空对象的proto属性设置为F.prototype。
- 初始化实例。函数F被传入参数并被调用,关键字this指向该实例。
- 返回实例
根据这几个特性,我们可以改造一下创建对象的方式
function Person(name) {
this.name = name
this.sayName = function() {
console.log(this.name)
}
}
var p = new Person('hunger')
构造函数
-
任何函数使用new表达式就是构造函数
-
每个函数都自动添加一个名称为
prototype
属性,这是一个对象 -
每个对象都有一个内部属性
__proto__
(规范中没有指定这个名称,但是浏览器都这么实现的) 指向其类型的prototype
属性,类的实例也是对象,其__proto__
属性指向“类”的prototype
prototype
prototype通过图示我们可以看出一些端倪,实例可以通过
__prop__
访问到其类型的prototype
属性,这就意味着类的prototype对象可以作为一个公共容器,供所有实例访问。
抽象重复
-
我们刚才的问题可以通过这个手段解决
-
所有实例都会通过原型链引用到类型的prototype
-
prototype相当于特定类型所有实例都可以访问到的一个公共容器
-
重复的东西移动到公共容器里放一份就可以了
看下代码
function Person(nick, age){
this.nick = nick;
this.age = age;
}
Person.prototype.sayName = function(){
console.log(this.nick);
}
var p1 = new Person();
p1.sayName();
这时候我们对应的关系是这样的
image.png
网友评论