有没有办法让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() {
答案 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)
以下是我在看到transpilers和TypeScript 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。