new的过程

网友投稿 547 2022-05-30

函数调用时前面不加new就按普通函数来 执行。加new后对其进行了相应的变动, 按构造函数来执行。

new的具体过程如下:

//例子:

function Person(name,age) {

this.userName = name;

this.userAge = age;

}

var personl = new Person('LULU',20)

1、创建一个新的空对象。(即实例对象)

new的过程

obj = {}

2 、设 置 原 型 链

将新对象obj的 __proto__属性指向构造函数的prototype 对象。(即所有实例对象通过__proto__可 以访问原型对象。构造函数的原型被其所有实例对象共享。)

obj.__proto__= Person.prototype

3 、将构造函数的thi s改指向新对象ob j并 执行函数代码。

(即给实例对象设置属性 userName, userAge并赋值。)

var result = Person.apply(obj,['LULU',20])

4 、如果构造函数中没有人为返回一个对象 类型的值,则返回这个新对象obj。否则直 接返回那个对象类型值。(一般定义的构造 函数中不写返回值。)

if (typeof(result) == 'object') {

return result;

}else{

return obj;

}

手动实现一个new操作,参数为构造函数 及其传参

//构造函数

function Person(name,age) {

this.userName = name;

this.userAge = age;

}

Person.prototype.sayAge = function(){

console.log(this.userAge)

}

// new操作函数newFun

function newFun() {

var obj = {};

Constructor = [].shift.call(arguments);

obj.__proto__ = Constructor.prototype;

var ret = Constructor.apply(obj, arguments);

return typeof ret === 'object' ? ret: obj;

};

//调用 newFun

var s1 = newFun(Person, 'xiaoyun',20);

console.log(s1.userName) //xiaoyun

console.log(s1.sayAge()) //20

备注:[].shift.call(arguments):删除并返回参数列表arguments中第一个参数,即获得构造函数。arguments剩余参数为构数传参。arguments是类数组,没有数组方法shift,可更改shift方法的this指向从而运用到 arguments 上。

数据结构

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Linux 和docker上的 SQL Server 的常见问题解答 (FAQ)
下一篇:Py之fvcore:fvcore库的简介、安装、使用方法之详细攻略
相关文章