zoukankan      html  css  js  c++  java
  • js面试-手写代码实现new操作符的功能

    我们要搞清楚new操作符到底做了一些什么事情?

    1.创建一个新的对象

    2.将构造函数的作用域赋给新对象(因此this指向了这个新对象)

    3.执行构造函数中的代码(为这个新对象添加属性)

    4.返回新对象

    上面给出了new操作符到底做了一些什么事情,我们就一步一步的实现这些,是不是就实现了new操作符的功能。

    首先定义一个构造函数Person如下:

    function Person(name) {
        this.name = name;
    }
    Person.prototype.sayName = function () {
        console.log(this.name);
    }

    然后创建模拟new操作符功能的函数如下:

    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();

    这样子就实现了new操作符的功能了。

    其实上面代码还可以这样子写:

    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();

    用Object.create可以创建一个没有任何属性的对象,如下:

    var o = Object.create(null);

  • 相关阅读:
    CF1172F
    CF506E
    【清华集训2014】玛里苟斯
    CF516E Drazil and His Happy Friends
    [NOI2017]游戏(2-SAT)
    [bzoj2878][Noi2012]迷失游乐园(基环树dp)
    bzoj3545/bzoj3551 [ONTAK2010]Peaks/Peaks加强版
    [bzoj1791][ioi2008]Island 岛屿(基环树、树的直径)
    [AT2306]Rearranging(拓扑序)
    [bzoj5301][Cqoi2018]异或序列
  • 原文地址:https://www.cnblogs.com/jsydb/p/12240426.html
Copyright © 2011-2022 走看看