我试图了解对象和JavaScript。
我遇到的问题是,似乎以下两者都做同样的事情。我的研究没有说明存在什么(如果有的话)差异,但这可能是因为在搜索框中很难对此提出疑问。
在代码中,我添加了评论来强调差异
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div id = "results"></div>
<script>
"use strict";
const results = document.getElementById("results");
const Thing = function(){ /* ****** THIS */
var _x;
this.set = function(x){
_x = x;
},
this.alert = function(){
results.innerHTML += _x + "<br />";
};
};
function Other(){ /* ****** AND THIS */
var _x;
this.set = function(x){
_x = x;
},
this.alert = function(){
results.innerHTML += _x + "<br />";
};
};
const t = new Thing();
t.set("b");
t.alert();
const t2 = new Thing();
t2.set("b2");
t2.alert();
t.alert();
t2.alert();
const o = new Other();
o.set("d");
o.alert();
const o2 = new Thing();
o2.set("d2");
o2.alert();
o.alert();
o2.alert();
</script>
</body>
</html>
有什么区别或它们都有效?
修改
我看过重复的var functionName = function() {} vs function functionName() {}。问题之间的区别在于我使用的是new
这个词。我的问题是,这确实有所作为吗?
答案 0 :(得分:2)
你可能会觉得这很有趣。
无论函数声明或表达如何,都可以使用new
。
查看控制台输出。 New创建了该函数的新实例。似乎没有任何其他副作用。
function funcOne() {};
var f1 = funcOne;
var f2 = funcOne;
var fx = new funcOne();
console.log(funcOne==f1); //true
console.log(f1==f2); //true
console.log(funcOne==fx); //false
const funcTwo = function(){};
var f3 = new funcTwo();
var f4 = new funcTwo();
console.log(funcTwo==f3) //false
console.log(f3==f4); //false
如果您正在寻找一些关于函数作为对象的讨论,我推荐这个帖子javascript : function and object...?
答案 1 :(得分:2)
new
采取的步骤是(from MDN):
- 创建一个新对象,继承自Foo.prototype。
- 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。新的Foo是 相当于新的Foo(),即如果没有指定参数列表,则Foo为 无争议地召集。
- 构造函数返回的对象成为整个新表达式的结果。如果构造函数没有 显式返回一个对象,使用在步骤1中创建的对象 代替。 (通常构造函数不返回值,但它们可以 如果他们想要覆盖正常的对象创建,请选择这样做 过程。)
醇>
在那一点上使用函数表达式或函数声明并不重要;只是你使用了一个函数。
function Foo() {
this.hello = "world";
}
const Bar = function() {
this.fizz = "buzz";
}
const foo = new Foo();
const bar = new Bar();
console.log(foo instanceof Foo);
console.log(bar instanceof Bar);