search

Home  >  Q&A  >  body text

javascript的原型(链)等问题,在开发过程中起到什么作用?

如题,闭包在开发过程中可以起到js文件打包压缩后不污染全局变量的作用。
那么大家常说的prototype和_proto_在开发过程中起到什么作用??

天蓬老师天蓬老师2828 days ago617

reply all(2)I'll reply

  • PHP中文网

    PHP中文网2017-04-11 13:31:25

    在原型链上扩展方法可以使所以由该对象衍生出的对象都具有此方法。
    直接讲概念貌似容易晕,举个例子

    var a = 'test';//字符串
    var b = 'b';
    a.test();//报错
    String.prototype.test = function(){console.log(this)}
    a.test();//正常输出
    b.test();//正常输出

    相信楼主应该清楚了

    reply
    0
  • PHP中文网

    PHP中文网2017-04-11 13:31:25

    嗯,这个问题其实问的挺广的,我把你的问题分成 prototype和__proto__ 是什么? 为什么要用它们 ? 它们用在了哪里? 这三个问题吧

    首先,prototype 和 _proto_ 是什么?

    在 JS 中,我们创建的每一个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向原型对象,该对象用于包含可以由特定类型的所有实例共享的属性和方法;

    而__proto__,其实并不是属于JS定义的标准。我们知道,当调用构造函数创建一个新实例后,该实例内部将包含一个指针,指向构造函数的原型对象,也就是前面提到了函数里的prototype属性所指向的那个对象,但是在实例里面你并没有属性去访问这个原型对象,这对于开发者很不方面,于是 Firefox、Safari 和chrome 在每个对象上都支持了一个属性,让开发者可以知道这个实例的原型对象是什么,没错,这个属性就是 __proto__;

    然后为什么要用它们

    为了性能优化
    如果我们在实现一个类的时候,把方法都写在构造函数里面,那么每次创建一个实例,所有的方法都会重新声明一次,随着实例数量的增多,重复声明定义的方法就越多,而这些方法其实是可以共享的,于是我们将这些方法都放到 prototype 原型对象里面,这样方法只需要声明一次就可以了

    为了实现继承
    JS 没有像 java、python一样的实现继承的class,而是通过原型链的概念来实现继承的,而原型链就是一个个原型(prototype)串在一起从而实现的

    最后它们用在了哪里

    这个问题就很广了,大部分流行的库和框架都用到了它,如 jquery,你也可以在某些业务逻辑上使用它去实现某种功能或者组件,而ECMA6的标准虽然出现了 class 类,但底层实现其实还是 prototype 原型链。

    reply
    0
  • Cancelreply