Javascript嵌套/封装原型方法

时间:2015-05-13 03:19:28

标签: javascript oop nested prototype encapsulation

有没有办法让Object原型方法嵌套在对象的定义中,以便保持最佳的可读性?主要关注的是涉及的内存占用和效率。

来自像C#这样的语言甚至可以看到PHP有更好的对象实现(In My Opinion)令人沮丧。是否有任何库或类似东西允许我习惯使用类似于Javascript的OOP?

我想我正在寻找嵌套的封装感觉,而不是在外壳之外。我也习惯于制作类的语言,它是你构造的对象的蓝图。也许我一直都错了,其他语言一直在复制内存中的代码,但我想它们已经过优化,内部方法指向单个内存引用。 javascript意味着是这样的,为什么,它是否落后,我做错了,还有其他方法吗?

我知道在编译语言中你会有类,每个类都有自己的文件 - 在这一点上,我觉得没有嵌套就半合理。这不适用于网络范例 - 所有内容都应尽可能少。有什么东西我应该研究将JS编译成单个文件吗?

例如

“错误的方式”: 方法/函数:getFullName包含在Person。

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;

    this.getFullName = function() {
        return this.firstName + " " + this.lastName;
    };
}

“正确的方式”使用原型

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
}

Person.prototype.getFullName = function() {

2 个答案:

答案 0 :(得分:1)

听起来你正在寻找可以回答几乎所有问题的TypeScript。

  

TypeScript是一种开发的免费开源编程语言   并由Microsoft维护。它是JavaScript的严格超集,   并添加了可选的静态类型和基于类的面向对象   编程语言。

http://www.typescriptlang.org/

Javascript是javascript,C#是C#,你无法直接比较两者。 Javascript可以很棒,我真的建议你在直接进入TypeScript之前阅读更多内容。

如果你有兴趣,这是一个很好的起点: http://shop.oreilly.com/product/9780596517748.do

答案 1 :(得分:0)

以下是我在看到transpilersTypeScript Babel for ES6之后想出的内容。

这是TypeScript&中原始问题的代码。 ES6&他们的翻译(这是一个真正的词吗?)

<强>打字稿

class Person {
    firstName: string;
    lastName: string;
    constructor(firstName: string, lastName: string) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    getFullName() {
        return this.firstName+' '+this.lastName;
    }
}

透明(最简单的结果): 我想这可能是我原来问题的直接简单答案。

var Person = (function () {
    function Person(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    Person.prototype.getFullName = function () {
        return this.firstName + ' ' + this.lastName;
    };
    return Person;
})();

<强> ES6

class Person {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    getFullName() {
        return this.firstName+' '+this.lastName;
    }
}

<强> Transpiled

"use strict";

var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Person = (function () {
  function Person(firstName, lastName) {
    _classCallCheck(this, Person);

    this.firstName = firstName;
    this.lastName = lastName;
  }

  _createClass(Person, [{
    key: "getFullName",
    value: function getFullName() {
      return this.firstName + " " + this.lastName;
    }
  }]);

  return Person;
})();

透明松散模式

"use strict";

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Person = (function () {
  function Person(firstName, lastName) {
    _classCallCheck(this, Person);

    this.firstName = firstName;
    this.lastName = lastName;
  }

  Person.prototype.getFullName = function getFullName() {
    return this.firstName + " " + this.lastName;
  };

  return Person;
})();

据我所知,TypeScript是一个构建在JS之上的“超集”,其中一个显而易见的补充是显式类型。 ES6和更高版本是我们所知道的JavaScript,它们尚未被完全采用并完全集成到大多数现代浏览器中。这就是为什么编译器从ES6编译到ES5的原因,这似乎是现代浏览器目前完全支持的。

总结......

尽管我喜欢键入的语言,但我觉得它在JS中可能有些过分,ES6看起来更像我以前看过的JS(尽管与C#/ Java / PHP相比,这似乎与我原来的问题略有矛盾),那么ES6实际上是未来的香草JS;) TypeScript似乎转化为简单的JS,而ES6增加了一些小的开销和一些健全功能。 TS很可能在转换过程中处理一些检查 - 我确信一个正确的IDE也会在转换之前检查错误,而Babel的转换代码将允许您在转换后继续安全地编写代码。与实际项目大小相比,Babel的开销在源代码大小方面似乎并不多。从这个小测试用例中可以很难正确地判断它们,还有很多用于转换器的选项。

Babel的ES6-&gt;没有完整性检查的ES5松散模式与TypeScript的代码相同。 TS Transpiled的上述代码将是现代浏览器支持的最小香草javascript。

我是一个肮脏的IDE爱好者,很高兴看到TypeScript的在线IDE完成和运行,而Babel只是一个带有一些基本帮助的荧光笔,如现在的自动双引号。我使用Jetbrains的产品,很高兴看到他们支持TS和ES6。