再一次:JS函数和对象

时间:2015-06-21 13:21:57

标签: javascript function object

所以我正在阅读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知道它的构造函数?或者它知道原型可能吗?

1 个答案:

答案 0 :(得分:1)

  

JS如何知道具有函数的对象之间的区别   属性和已添加属性的构造函数?

有不同的术语:

  • 函数Function个实例的对象。
  • 可调用对象是具有内部[[Call]]方法的对象。
  • 构造函数是具有内部[[Construct]]方法的对象。

通常它们是一致的,所以通常称它们为函数

然后很容易:

  • 如果您尝试call一个对象且它有一个[[Call]]方法,则会调用该方法。否则它不可调用,所以错误。
  • 如果您尝试instantiate一个对象且它有一个[[Construct]]方法,则会调用该方法。否则它不是构造函数,所以错误。

此外,还有[[Class]]内部属性,函数通常为"Function"