深色模式
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 张三.