UDN-企业互联网技术人气社区

板块导航

浏览  : 381
回复  : 2

[实例] JavaScript教程:JS中的原型

[复制链接]
牛娜的头像 楼主
发表于 2015-9-7 15:01:15 | 显示全部楼层 |阅读模式
本帖最后由 牛娜 于 2015-9-7 15:01 编辑

Keith Peters 几年前发表的一篇博文,关于学习没有“new”的世界,其中解释了使用原型继承代替构造函数。两者都是纯粹的原型编码。

标准方法(The Standard Way)

一直以来,我们学习的在 JavaScript 里创建对象的方法都是创建一个构造函数,然后为函数的原型对象添加方法。

  1.   function Animal(name) {
  2.       this.name = name;
  3.     }
  4.     Animal.prototype.getName = function() {
  5.       return this.name;
  6.     };
复制代码

对于子类的解决方案是,创建一个新的构造函数,并且设置其原型为其父类的原型。调用父类的构造函数,并将this设置为其上下文对象。

  1.     function Dog(name) {
  2.       Animal.call(this, name);
  3.     }
  4.     Dog.prototype = Object.create(Animal.prototype);
  5.     Dog.prototype.speak = function() {
  6.       return "woof";
  7.     };
复制代码

    如果你接触过任何原型语言,你会觉得上面的例子看起来很奇怪。我尝试过 IO 语言——一门基于原型的语言。在原型语言中,可以通过克隆对象并添加属性和方法的方式创建一个原型。然后你能克隆刚才创建的原型,从而创建一个可以使用的实例,或者克隆它来创建另一个原型。上面的例子在 IO 里,看起来像下面这样:

  1.     Animal := Object clone
  2.     Animal getName := method(name)

  3.     Dog := Animal clone
  4.     Dog speak := method("woof")

  5.     dog := Dog clone
  6.     dog name := "Scamp"
  7.     writeln(dog getName(), " says ", dog speak())
复制代码

好消息(The Good News)

    在JavaScript中,也可以使用这种编码方式!Object.create 函数和 IO 里的 clone 类似。下面是在JavaScript中,纯原型的实现。除了语法不同之外,和 IO 版本一样。

  1.     Animal = Object.create(Object);
  2.     Animal.getName = function() {
  3.       return this.name;
  4.     };

  5.     Dog = Object.create(Animal);
  6.     Dog.speak = function() {
  7.       return "woof";
  8.     };

  9.     var dog = Object.create(Dog);
  10.     dog.name = "Scamp";
  11.     console.log(dog.getName() + ' says ' + dog.speak());
复制代码

坏消息(The Bad News)

当使用构造函数时,JavaScript 引擎会进行优化。在 JSPerf上测试两个不同的操作,显示基于原型的实现比使用构造函数的方式最多慢90多倍。

另外,如果你使用类似 Angular的框架,当创建控制器和服务时,必须使用构造函数。

引入类(Enter Classes)

ES6带来了新的 class 语法。但其只是标准构造函数方法的语法糖。新的语法看起来更像 Java 或 c#,但其幕后仍然是创建原型对象。这会让来自基于类语言的人感到迷惑,因为当创建原型时,他们希望类和他们的语言有相同的属性。

   
  1. class Animal {
  2.       constructor(name) {
  3.         this.name = name;
  4.       }
  5.       getName() {
  6.         return this.name;
  7.       }
  8.     }

  9.     class Dog extends Animal {
  10.       constructor(name) {
  11.         super(name);
  12.       }
  13.       speak() {
  14.         return "woof";
  15.       }
  16.     }

  17.     var dog = new Dog("Scamp");
  18.     console.log(dog.getName() + ' says ' + dog.speak());
复制代码

     结论(Conclusion) 如果让我选择,我会用纯原型的风格。这更具有表现力,动态和有趣。由于虚拟机会对构造函数方法进行优化,所有框架都会选择构造函数方法,在产品代码中,我会继续使用构造函数。一旦 ES6 变得流行,我希望使用新的类语法代替古老的构造函数方法。

英文:http://jurberg.github.io/blog/2014/07/12/javascript-prototype/
发表于 2015-9-17 17:59:12 来自手机 | 显示全部楼层
占坑编辑ing
使用道具 举报

回复

发表于 2015-9-20 11:22:24 | 显示全部楼层
js太强大了,好多工作前端都可以做了…
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部