假设我有以下功能:
var A = function() {
var label = "hello";
return {
getLabel: function() { return label; }
}
};
Run Code Online (Sandbox Code Playgroud)
之间有什么区别:
var a = A();
Run Code Online (Sandbox Code Playgroud)
和
var a = new A();
Run Code Online (Sandbox Code Playgroud)
?
注意:我不是在问这里JavaScript中的'new'关键字,而是它在这个特定示例中的行为方式.
我已经使用Java很长一段时间了,很长一段时间我一直在使用GWT(Google Web Toolkit)进行Web开发.它的美妙之处在于我拥有了面向Java对象的构造,并且不会担心它如何被转换为GWT - 让Google来处理它.我对Javascript的了解已经足够,但并不是因为我可以用它进行大量的Web开发.后来我决定我必须对Javascript有更深入和更彻底的了解,这是一个真正的过山车 - 只是在我认为我得到了一些东西,有些东西来证明我错了 - 我只是被误解了.
有什么比stackoverflow更能表达我的关注的地方:我正在寻找一些资源和指向什么是Javascript等同于以下一些Java概念:
Class
instance of a class - object
Member variables
Getters
Setters
Abstract Class
Interface
Inheritance
Access Modifiers
Constructors
Run Code Online (Sandbox Code Playgroud)
我知道其中一些概念,但正如我所说 - 我相信我有一些概念上的困难.如果有人可以指出一个真正的javascript大师试图在这里查明这些概念,我将非常高兴.
我尝试用这样的代码在JavaScript中模拟'new'运算符:
Function.method('new', function ( ) {
var objPrototype = Object.create(this.prototype);
var instance = this.apply(objPrototype, arguments);
return instance;
});
Run Code Online (Sandbox Code Playgroud)
但是,为了涵盖所有情况,return语句应如下所示:
return (typeof instance === 'object' && instance ) || objPrototype;
Run Code Online (Sandbox Code Playgroud)
现在进行测试:
var SomeClass = function (param1, param2) {
this.param1 = param1;
this.param2 = param2;
};
var test1 = String.new('test1'); //in this case, the "instance" variable is an object
var test2 = SomeClass.new('test1', 'test2'); // in this case, the "instance" variable is undefined
Run Code Online (Sandbox Code Playgroud)
这正是"新"运算符的作用吗?还有什么案子可以解决吗?
我是javascript中的新对象.请阅读https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript上的这个主题,并对此感到困惑.
我不明白功能和对象之间的区别.一方面,函数应该是Function的实例(它是Object的子元素),因此函数也应该是一个Object.
另一方面,对象本身表示为键值对,例如:
var User = {name:"Tomy", password:"secret"}
这在功能定义方面与代码兼容性有很大不同......
我可以用两种不同的方式创建功能吗?
var User = function () {this.name="Tomy"; this.password="secret";}
我在javascript中阅读了关于"new"关键字的主题(JavaScript 中的'new'关键字是什么?).但是,我还在迷雾中; 我们来谈谈这个例子:
var foo = function() {
return {
setA: function(a) {
this.a = a;
},
readA: function() {
console.log(this.a);
}
};
};
Run Code Online (Sandbox Code Playgroud)
现在关于这两段代码是什么:
一:
var bob1 = foo();
bob1.setA(10);
bob1.readA();
Run Code Online (Sandbox Code Playgroud)
二:
var bob2 = new foo();
bob2.setA(10);
bob2.readA();
Run Code Online (Sandbox Code Playgroud)
在我的水平上,我看不出任何差异.那么使用关键字"new"有什么好处呢?
使用内置的JavaScript对象和构造函数,我注意到有点奇怪的东西.
有时,可以通过调用构造函数来获取新对象new.例如:
> new Array(1,2,3,4)
[1, 2, 3, 4]
> Array(1,2,3,4)
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
但有时这不起作用:
> Date()
"Thu Jun 05 2014 00:28:10 GMT-0600 (CST)"
> new Date()
Date 2014-06-05T06:28:10.876Z
Run Code Online (Sandbox Code Playgroud)
是否在ECMAScript规范中的任何位置定义了非新构造函数内置函数的行为?请注意,此行为实际上很有用; 我可以通过调用来制作一个非稀疏的数组副本Array.apply(arr),但如果它是跨平台的话,我只会觉得这样做很舒服.
我问这个问题是因为我注意到 TypeScript 允许声明返回原始类型的构造函数,例如:
type Constructor1 = new () => string; // Primitive string
Run Code Online (Sandbox Code Playgroud)
相对于
type Constructor2 = new () => String; // String object
Run Code Online (Sandbox Code Playgroud)
这让我想知道 JavaScript 是否真的允许创建一个在使用语义调用时返回原始值的函数,即通过原始性测试的new值:
type Constructor1 = new () => string; // Primitive string
Run Code Online (Sandbox Code Playgroud)
不用说,我找不到任何生成原始值的构造函数调用的示例,因此我想这一定是 TypeScript 类型模型的另一个奇怪之处。或者原始构造函数真的存在吗?
作为参考,这是我尝试过的。
预定义的构造函数Number、Boolean、String等在使用 调用时都会生成一个对象new,尽管它们在作为常规函数调用时返回一个原始值。IE
type Constructor2 = new () => String; // String object
Run Code Online (Sandbox Code Playgroud)
function isPrimitive(value) {
return value !== Object(value);
}
Run Code Online (Sandbox Code Playgroud)
return在构造函数中语句return会覆盖构造函数中的实例this,但前提是返回值是对象: …
我目前知道在JavaScript中构建单例的两种方法.第一:
var singleton = {
publicVariable: "I'm public",
publicMethod: function() {}
};
Run Code Online (Sandbox Code Playgroud)
它是完美的,除了它没有我可以运行初始化代码的构造函数.
第二:
(function() {
var privateVariable = "I'm private";
var privateFunction = function() {}
return {
publicVariable: "I'm public",
publicMethod: function () {}
}
})();
Run Code Online (Sandbox Code Playgroud)
第一个版本没有私有属性,也没有构造函数,但它更快更简单.第二个版本更复杂,更丑,但有一个构造函数和私有属性.
我不需要私有属性,我只想拥有一个构造函数.有没有我缺少的东西,或者是我唯一拥有的两种方法?
我有以下功能
var myInstance = (function() {
var privateVar = 'Test';
function privateMethod () {
// ...
}
return { // public interface
publicMethod1: function () {
// all private members are accesible here
alert(privateVar);
},
publicMethod2: function () {
}
};
})();
Run Code Online (Sandbox Code Playgroud)
如果我在函数中添加新内容,会有什么不同.从萤火虫看来,似乎两个物体是相同的.据我了解,两者都应该强制执行单身模式.
var myInstance = new (function() {
var privateVar = 'Test';
function privateMethod () {
// ...
}
return { // public interface
publicMethod1: function () {
// all private members are accesible here
alert(privateVar);
},
publicMethod2: function …Run Code Online (Sandbox Code Playgroud) 看到这段代码:
function friend(name) {
return { name: name };
}
var f1 = friend('aa');
var f2 = new friend('aa');
alert(f1.name); // -> 'aa'
alert(f2.name); // -> 'aa'
Run Code Online (Sandbox Code Playgroud)
f1和之间有什么区别f2?
javascript ×10
class ×1
constructor ×1
function ×1
gwt ×1
java ×1
new-operator ×1
object ×1
oop ×1
primitive ×1
standards ×1