一、构造函数
var Vehicle = function () {
this.price = 1000;
};
构造函数是一个函数名的首字母大写的普通的函数,但他与普通函数相比有两个不同:
(1)函数体内部使用this关键字,代表了所要生成的对象实例
(2)生成对象的时候,必须使用new命令
二、new命令
var v = new Vehicle();
var v = new Vehicle(200); //如果Vehicle函数有形参时
new命令的原理:
当使用new命令时,它后面的构造函数依次执行,
(1)创建一个空对象,作为将要返回的对象实例
(2)将这个对象的原型指向构造函数的prototype属性
(3)将这个对象赋值给构造函数内部的this关键字
(4)开始执行构造函数内部的代码
源码实现
//new Foo(args) <=> myNew(Foo, args)
function myNew (Foo, ...args) {
let obj = Object.create(Foo.prototype); //相当于obj.__proto__ = Foo.prototype
let res = Foo.apply(obj, args); //执行构造函数并绑定this
//构造函数return对象,则返回该对象,否则返回obj
return Object.prototype.toString.call(res) === '[object Object]' ? res:obj;
}
三、Object.create()
以一个对象作为参数,然后以它为原型,返回一个实例对象 new_obj.prototype === obj,而new的原型链是 new_obj.__proto__ === Foo.prototype。
var obj = {
name:'Mark',
age:17
};
var new_obj = Object.create(obj);
console.log(Object.getPrototypeOf(new_obj) === obj); //true
该实例完全继承原型对象的属性。
参考资料: