为了账号安全,请及时绑定邮箱和手机立即绑定

javascript中的new关键字做了什么?

首先我们来看一段非常熟悉的代码:

function Hero(name,ability){
    this.name=name;
    this.ability=ability;
}
Hero.prototype.getAbility=function(){
    return this.ability;
}
var invoker=new Hero('Invoker','invoke')
console.log(invoker.getAbility());     //invoke
console.log(Object.getPrototypeOf(invoker)===Hero.prototype)     //true

var invoker=new Hero('Invoker','invoke')首先我们得明确这里的 new Hero后的Hero到底是什么?你可能会不假思索的认为这就是个class类嘛。在ES6之前javascript中并没有传统类的概念。这里的Hero不是类,而是构造器函数。顺带提一句在es6里function* (){}这样的函数被称为生成器函数。所以说Hero毫无疑问就是个函数,只不过它的调用方式,是通过new关键字来调用的。调用之后的结果就是生成了一个新的对象,如果我们了解javascript这门语言的特性,就不难知道,生成一个新对象实质上就是对Object.prototype对象进行克隆,然后伴随其他操作。所以我们可以通过下面代码理解这个过程:

function Hero(name,ability){
    this.name=name;
    this.ability=ability;
}

Hero.prototype.getAbility=function(){
    return this.ability;
}

var createObj=function(){
    var obj=new Object(),
        argumentsArray=[].slice.apply(arguments),//把arguments这个类数组转换为数组
        Constructor=argumentsArray[0],//取得参数中的构造器函数(第一个参数)
        Params=argumentsArray.slice(1);//取得参数中的剩余部分
        obj.__proto__=Constructor.prototype;//原型指向
    var newObj=Constructor.apply(obj,Params);//使用传入的构造器Constructor为新对象newObj设置属性
    return typeof newObj==='object'?newObj:obj;//返回新对象
}

这样,我们可以看到使用下面的代码,会产生一样的效果

var Invoker=createObj(Hero,'invoker','invoke');
var Invoker1=new Hero('invoker','invoke');
console.log(Invoker.getAbility());     //invoke
console.log(Invoker1.getAbility());     //invoke

我们可以把上面的Hero,改为ES6中的class‘语法糖’的方式重写一下,可以对比一下:

class Hero{
        constructor(name,ability){
        this.name=name;
        this.ability=ability;
    }
    getAbility(){
    return this.ability;
    }
}
let Invoker=new Hero('invoker','invoke');
console.log(Invoker.getAbility());
typeof Hero//function

所以说ES6中的class完全可以认为是构造函数写法的一种语法糖,但是ES6中的class也有它特别的地方。,比如说内部所有定义的方法,都是不可枚举的;类的所有方法都定义在类的prototype属性上面。

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消