function Person(name) { //创建一个构造函数
console.log(this); // Person {} 空的person 对象
this.name = name; //this指的是构造函数的实例(给实例添加name属性)
}
Person.prototype.age = 18; //给构造函数的原型添加属性age
let man1 = new Person('利利') //构造函数的实例1
let man2 = new Person('张三') //构造函数的实例2
console.log(man1);
console.log(man1.name);
console.log(man1.age);
console.log(man2);
console.log(man2.name);
console.log(man2.age);
打印结果:
思考: new操作符做了什么事?
- 创建一个空对象(即{});
- 该对象的__proto__属性指向构造函数的原型(prototype);
- 将该对象作为this的上下文 ;即执行构造函数,他的this是构造函数的实例。
- 如果构造函数没有返回对象,则返回this。
手动写一个函数,实现new操作符做的事
function _new (ctor, ...args) {
// 第一步,创建新对象
var obj = {};
// 第二步,对象的__proto__属性指向构造函数
obj.__proto__ = ctor.prototype
// 第三步,执行构造函数,并将构造函数的初始属性都挂载在新对象上
var result = ctor.call(obj, ...args);
// 返回新对象
return typeof result === 'object' ? result : obj;
}
let man3 = _new(Person, '老王');
console.log(man3);
打印结果:
相关知识点call,apply
背景: 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文 而存在的,换句话说,就是为了改变函数体内部 this 的指向。
语法:
- apply()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数是数组。
- call()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数必须例举出来