Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript手写系列:手写一个new实现 #6

Open
Hjw52 opened this issue Oct 24, 2020 · 0 comments
Open

JavaScript手写系列:手写一个new实现 #6

Hjw52 opened this issue Oct 24, 2020 · 0 comments

Comments

@Hjw52
Copy link
Owner

Hjw52 commented Oct 24, 2020

JavaScript手写系列:手写一个new实现

关于new的绑定:

  • 在JS中,构造函数只是使用new操作符时被调用的普通函数,他们不属于某个类,也不会实例化一个类。
  • 包括内置对象函数(比如String(..))在内的所有函数都可以用new来调用,这种函数调用被称为构造函数调用。
  • 实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”。

使用new来调用函数,或者说发生构造函数调用时,会自动执行下面的操作:

1、创建(或者说构造)一个新对象。

2、这个新对象会被执行[[Prototype]]连接。

3、这个新对象会绑定到函数调用的this。

4、如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。

这也就是实现new的整个思路过程。

具体代码:
function create() {
	// 创建一个空的对象
    var obj = new Object(),
	// 获得构造函数,arguments中去除第一个参数
    Con = [].shift.call(arguments);
	// 链接到原型,obj 可以访问到构造函数原型中的属性
    obj.__proto__ = Con.prototype;
	// 绑定 this 实现继承,obj 可以访问到构造函数中的属性
    var ret = Con.apply(obj, arguments);
	// 优先返回构造函数返回的对象
	return ret instanceof Object ? ret : obj;
};


//使用create代替new



function Person() {...}
// 使用内置函数new
var person = new Person(...)
                        
// 使用手写的new,即create
var person = create(Person, ...)

原理解析:

  • 1、用new Object() 的方式新建了一个对象obj
  • 2、取出第一个参数,就是我们要传入的构造函数。此外因为 shift 会修改原数组,所以 arguments 会被去除第一个参数
  • 3、将 obj 的原型指向构造函数,这样obj就可以访问到构造函数原型中的属性
  • 4、使用 apply,改变构造函数 this 的指向到新建的对象,这样 obj 就可以访问到构造函数中的属性
  • 5、返回 obj

概括来讲就是:新建一新对象,修改原型链指向构造函数和把构造函数this指向新对象并返回。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant