javascript - 如何理解关于构造函数的这段代码?

查看:70
本文介绍了javascript - 如何理解关于构造函数的这段代码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

var Class = function () {
    var klass = function () {
    };
    klass.prototype.init = function () {};
    // 定义 prototype 的别名
    klass.fn = klass.prototype;
    // 定义类的别名
    klass.fn.parent = klass;
    // 给类添加属性
    klass.extend = function (obj) {
        var extended = obj.extended;
        for (var i in obj) {
            klass[i] = obj[i];
        }
        if (extended) extended(klass)
    };
    // 给实例添加属性
    klass.include = function (obj) {
        var included = obj.included;
        for (var i in obj) {
            klass.fn[i] = obj[i];
        }
        if (included) included(klass)
    };
    return klass;
};
var Person = new Class;
Person.include({
    save: function(id) { console.log("id is: " + id); },
    exists: function(id) { /* ... */ }
});
var person = new Person;
person.save();

关于两个new的问题,第一个是new的是klass的实例,第二个new的是什么?打印出来的Person的原型是klass,person也是klass?这是什么情况?还是我完全理解错了?

解决方案

根据 MDN new 操作符:

当代码 new foo(...) 执行时:

  1. 一个新对象被创建。它继承自foo.prototype.

  2. 构造函数 foo 被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new foo 等同于 new foo(), 只能用在不传递任何参数的情况。

  3. 如果构造函数返回了一个对象,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象,ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。

根据第 3 条, 所以, 在该例中, 构造函数Class通过return klass;返回一个函数这一对象, 所以通过该对象可以再次构造Person类的实例.
在 Javascript 中, 函数也是对象. 根据MDN function:

在 JavaScript 中, 每个函数实际上都是一个Function对象。

这篇关于javascript - 如何理解关于构造函数的这段代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆