所以我正在阅读JS编程JS应用程序和JS的好部分。阅读对象和函数......显然是相同的。根据 Crockford 本人(以及几乎每个人)。但后来我问:如果它们是相同的,那么为什么我有一个对象:
var myObject = {
value: 0,
increment: function (inc) {
this.value += inc;
}
};
我可以像这样添加一个函数:
myObject.double = function () {
this.value += this.value;
}
但是当我有一个构造函数(一个函数..):
var myConstructor = function() {
this.value = 0;
this.increment = function(inc){
this.value += inc;
};
};
我无法添加这样的功能:
myConstructor.double = function(){
this.value += this.value;
};
但仅限于这样的原型:
myConstructor.prototype.double = function(){
this.value += this.value;
};
现在怎么会有人说对象和功能是一样的?
有趣的是," double"的分配构造函数的方法没有给出错误,只有当你用new创建一个对象并且在这个对象上调用double方法时才会给出:" TypeError找不到"。
此外,构造函数上的console.log提供:
{ [Function] double: [Function] }
注意" [功能]"之间缺少的逗号。和"双"顺便说一句..但这可能表明真正的函数实际上是对象,因为我们只是将double属性(一个函数)添加到这个对象。
但问题变成了......为什么我可以在myConstructor上调用 new 而不是myObject? JS如何区分它们?如果它们都是可以包含属性,值和函数的对象。?
编辑:好的,所以我觉得他们不一样,抱歉我的措辞不精确。但仍有一个问题:JS 如何知道具有函数属性的对象与已添加属性的构造函数之间的区别?
var object = {
property : "value",
method: function(){
}
};
console.log(object)输出到:
{ property: 'asdf', method: [Function] }
和
var myConstructor = function() {
this.property = "value";
this.method = function(inc){
};
};
myConstructor.property = "value";
console.log(myConstructor)输出到:
{ [Function] property: 'value' }
因此,如果一个对象有一个匿名函数,JS知道它的构造函数?或者它知道原型可能吗?
答案 0 :(得分:1)
JS如何知道具有函数的对象之间的区别 属性和已添加属性的构造函数?
有不同的术语:
Function
个实例的对象。[[Call]]
方法的对象。[[Construct]]
方法的对象。通常它们是一致的,所以通常称它们为函数。
然后很容易:
[[Call]]
方法,则会调用该方法。否则它不可调用,所以错误。[[Construct]]
方法,则会调用该方法。否则它不是构造函数,所以错误。此外,还有[[Class]]
内部属性,函数通常为"Function"
。