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

  • 相关阅读:
    C#listbox使用方法
    poj 3894 System Engineer (二分图最大匹配--匈牙利算法)
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 黑白无常
  • 原文地址:https://www.cnblogs.com/jsydb/p/12240426.html
Copyright © 2011-2022 走看看