1:new的原理
new运算符是用来实例化一个类,从而在内存中分配一个实例对象。
如果函数或者方法调用前带有关键字new, 则构成构造函数调用.构造函数调用会创建一个新的空对象,该对象继承自构造函数的prototype属性。构造函数试图初始化这个新创建的对象,并将这个对象用作其上下文。
任何函数只要使用 new 操作符调用就是构造函数,而不使用 new 操作符调用的函数就是普通函数。
// 自定义构造函数
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.sayName = function () {
console.log(this.name);
}
}
var person1 = new Person('zhangsan', 29, 'male');
var person2 = new Person('lisi', 19, 'female');
person1.sayName(); // zhangsan
person2.sayName(); // lisi
要创建 Person 的实例,应使用 new 操作符。以这种方式调用构造函数会执行如下操作。
(1) 在内存中创建一个新对象。
(2) 这个新对象内部的[[Prototype]] 特性被赋值为构造函数的 prototype 属性。
(3) 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
(4) 执行构造函数内部的代码(给新对象添加属性)。
(5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
new工作的原理是
当new一个函数的时候,会创建一个新的实例,然后将得到原函数的原型。
2:如何正确判断this?该博客有this的具体使用
this 指向问题 一般情况下·this 的最终指向的是那个调用它的对象
JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。
在方法中,this 表示该方法所属的对象。
如果单独使用,this 表示全局对象。
在函数中,this 表示全局对象。
在事件中,this 表示接收事件的元素。
在显式函数绑定时,我们可以自己决定this的指向
//1: 全局作用域·或者普通作用域中this指向的是全局对象 window
console.log(this);
function fn() {
console.log(this);
}
fn();
// 2 方法调用中谁调用this 就指向谁
var o = {
sayHi: function () {
console.log(this);
}
}
o.sayHi();
// 3:构造函数中this构造函数的实例
function Fun() {
console.log(this); //this指向的是fun 实例对象
}
var fun = new Fun();
显示绑定:函数通过call()、apply()调用,bind()方法绑定,this指向的就是指定的对象;
在下面实例中,当我们使用 person2 作为参数来调用 person1.fullName 方法时, this 将指向 person2, 即便它是 person1 的方法:
var person1 = {
fullName: function () {
return this.firstName + " " + this.lastName;
}
}
var person2 = {
firstName: "Zach",
lastName: "Muyi",
}
var name = person1.fullName.call(person2); // 返回 "Zach Muyi"
console.log(name);