js面试-手写代码实现new操作符的功能
2021-04-23 04:28
标签:执行 argument cti 添加 person 改变 建模 console str 我们要搞清楚new操作符到底做了一些什么事情? 1.创建一个新的对象 2.将构造函数的作用域赋给新对象(因此this指向了这个新对象) 3.执行构造函数中的代码(为这个新对象添加属性) 4.返回新对象 上面给出了new操作符到底做了一些什么事情,我们就一步一步的实现这些,是不是就实现了new操作符的功能。 首先定义一个构造函数Person如下: 然后创建模拟new操作符功能的函数如下: 这样子就实现了new操作符的功能了。 其实上面代码还可以这样子写: 用Object.create可以创建一个没有任何属性的对象,如下: var o = Object.create(null); js面试-手写代码实现new操作符的功能 标签:执行 argument cti 添加 person 改变 建模 console str 原文地址:https://www.cnblogs.com/jsydb/p/12240426.htmlfunction Person(name) {
this.name = name;
}
Person.prototype.sayName = function () {
console.log(this.name);
}
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function () {
console.log(this.name);
}
function createPerson() {
// 1 创建一个新的对象
var o = {};
// 2 获取构造函数,以便实现作用域的绑定
var _constructor = [].shift.call(arguments);
// 3 由于通过new操作创建的对象实例内部的不可访问的属性[[Prototype]](有些浏览器里面为__proto__)
//指向的是构造函数的原型对象的,所以这里实现手动绑定。
o.__proto__ = _constructor.prototype;
// 4.作用域的绑定使用apply改变this的指向
_constructor.apply(o, arguments);
return o;
}
var person1 = createPerson(Person, ‘ydb‘);
person1.sayName();function Person(name) {
this.name = name;
}
Person.prototype.sayName = function () {
console.log(this.name);
}
function createPerson() {
// 1 获取构造函数,以便实现作用域的绑定
var _constructor = [].shift.call(arguments);
// 2 创建一个对象
var o = Object.create(_constructor.prototype);
// 由于通过new操作创建的对象实例内部的不可访问的属性[[Prototype]](有些浏览器里面为__proto__)
//指向的是构造函数的原型对象的。
//而Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。// 4.作用域的绑定
_constructor.apply(o, arguments);
return o;
}
var person1 = createPerson(Person, ‘ydb‘);
person1.sayName();