深色模式
JavaScript 面向对象
特点
Java 的面向对象是基于类的,JavaScript 的面向对象是基于构造函数(constructor)与原型链(prototype)的。
构造函数
是一个普通的函数
js
var Vehicle = function () {
this.price = 1000;
};
但是构造函数有两个特点:
- 函数体内部使用了
this
关键字,代表了所要生成的对象实例。 - 生成对象的时候,必须使用
new
命令。
new
new
的用法
new
命令的作用,就是执行构造函数,返回一个实例对象。
js
var Vehicle = function () {
this.price = 1000;
};
var v = new Vehicle();
v.price // 1000
使用new
时,推荐在构造函数后面带上括号。
js
// 推荐的写法
var v = new Vehicle();
// 不推荐的写法
var v = new Vehicle;
漏掉new
时,相当于普通的函数调用,函数中的this
不再指向新生成的对象,而是指向调用者(一般是全局对象)。
js
var Vehicle = function (){
this.price = 1000;
};
var v = Vehicle();
v // undefined
price // 1000
分析上面的代码:由于函数默认返回
undefined
,所以v
是undefined
,由于this
指向全局对象,所以函数中的代码相当于创建全局变量price
并为其赋值1000
。
可以在构造函数中启用严格模式,防止调用者漏写 new
,如果漏写会报错。
js
function Fubar(foo, bar){
'use strict';
this._foo = foo;
this._bar = bar;
}
new
的原理
使用new
命令时,它后面的函数依次执行下面的步骤。
- 创建一个空对象,作为将要返回的对象实例。
- 将这个空对象的原型,指向构造函数的
prototype
属性。 - 将这个空对象赋值给函数内部的
this
关键字。 - 开始执行构造函数内部的代码。
如果构造函数内部有 return
语句,而且 return
后面跟着一个对象,new
命令会返回return
语句指定的对象;否则,就会不管return
语句,返回this
对象。
如果对普通函数使用new
调用,会返回一个空对象。
new.target
函数内部可以使用new.target
属性。如果当前函数是new
命令调用,new.target
指向当前函数,否则为undefined
。
Object.create()
js
var person1 = {
name: '张三',
age: 38,
greeting: function() {
console.log('Hi! I\'m ' + this.name + '.');
}
};
var person2 = Object.create(person1);
person2.name // 张三
person2.greeting() // Hi! I'm 张三.