【问题标题】:Get the properties of the function object获取函数对象的属性
【发布时间】:2015-07-16 17:31:37
【问题描述】:

我正在学习面向对象的javascript,来自Object Palyground

根据教程,函数本身被视为一个对象,我知道您可以使用 in javascript 中的关键字获取对象的属性

var obj = {a:"hello",b=123};
for(var prop in obj)
alert(var);

上面的代码按预期为我提供了 function object obj 中存在的键

但是当我在这种情况下使用相同的代码时

var funObj = function(a,b){
   alert("hello");
}
for(var prop in funObj)
alert(prop);

或者在这种情况下甚至

function myFunction(a,b){
 alert("hello");
}
for(var prop in myFunction)
alert(prop);

它没有给我任何输出,理想情况下,根据教程,函数对象应包含 三个属性:名称、长度和原型,但我没有得到任何输出,我做错了

请帮帮我

【问题讨论】:

    标签: javascript


    【解决方案1】:

    我哪里做错了

    for...in 仅迭代 可枚举 属性。原生对象的默认属性通常是不可枚举的。

    您可以使用Object.getOwnPropertyNames 获取函数对象的属性列表:

    > Object.getOwnPropertyNames(function() {})
    ["length", "name", "arguments", "caller", "prototype"]
    

    或者,如果您只是为了学习目的而检查属性,请使用console.dir 记录函数:

    【讨论】:

    • 非常感谢这正是我想要的
    • 还有一个查询,如果我理解正确,当您说 ENUMERABLE 属性时,这是否意味着用户定义的属性而不是本地属性?
    • 不一定。默认情况下,通过赋值创建的属性,例如foo.bar = 42; 是可枚举的。但是,您也可以通过Object.defineProperty(foo, 'bar', {value: 42, enumerable: false}); 创建不可枚举的属性。因此,“可枚举性”确实是每个属性的特征。
    • 再次感谢,我来自 Java 背景,所以这些概念对我来说有点混乱;)
    【解决方案2】:
    var obj = {a:"hello",b=123};
    

    如果不一样

    var obj = function(a, b) {}
    

    如果你想让 A 和 B 成为属性,你应该这样做:

    var obj = function(a, b) {
       this.a = a;
       this.b = b;
    }
    

    这样,obj.a 和 obj.b 更有意义,但还没有那么多。 function(){} 是你的构造函数。因此,您需要实际构建一个实例才能正确使用它。

    var myObj = new obj('value for a', 'value for b');
    for (var prop in myObj) {
       // Prop = a || b
       console.log(prop);
    
       // Values for a and b
       console.log( myObj[ prop ] );
    }
    

    如果您以静态方式使用它,则不必执行函数操作。 也不是那个对象没有长度方法。数组可以。

    为了让这变得非常简单,而且完全不准确,{}(对象)有点静态,而 function(){} 是可实例化的(这个词甚至存在吗?),这意味着您可以使用“new”,因此受益于函数构造函数。

    这都是真正的技术,看起来你是从 javascript 开始的。如果我不清楚或者您需要一些精确度,请告诉我。

    希望对您有所帮助。

    【讨论】:

    • 嗨,Bene,感谢您的快速响应,我精通 Java,但对 javascript 不太熟悉,我正在尝试学习面向对象的概念,根据 javascript 文档
    【解决方案3】:

    JavaScript 中的Function 可以称为“第一类”,因为它是一个可调用对象,这意味着它是一个添加了可调用语义的对象。在某些方面,JavaScript 中的 ArrayFunction 相似,因为它们都是对象,但包含特殊功能。 注意:关于 JavaScript 的常见说法是 "everything is an object",但事实并非如此。 简单原语stringbooleannumbernullundefined)都不是对象(尽管如果您尝试将它们视为这样)。

    var obj = {bar: 'hi'};
    Object.keys(obj); // ["bar"]
    
    function func() {}
    Object.keys(func); // []
    func.bar = 'hello';
    Object.keys(func); // ["bar"];
    
    var arr = [1, 2, 3];
    Object.keys(arr); // ["0", "1", "2"]
    arr.bar = 'hey';
    Object.keys(arr); // ["0", "1", "2", "bar"]
    

    bar 出现在所有三个中,因为这些属性默认设置为enumerable。但是,正如您所指出的,一个函数还有一些其他属性,但这些属性没有显示出来。为什么?我们先看obj

    obj.propertyIsEnumerable('bar'); // true
    

    bar 默认设置为enumerable

    现在让我们看看func 中的bar

    func.propertyIsEnumerable('bar'); // true
    

    这就解释了为什么bar 出现在funcname 呢?

    func.propertyIsEnumerable('name'); // false
    

    啊啊!它是不可枚举的。对于通过 JavaScript 引擎自动链接或分配给对象的许多属性/方法来说,情况都是如此。例如,数组对象的length 属性。

    arr.propertyIsEnumerable('length'); // false
    

    话虽如此,如果您是 JS 新手,我强烈建议您阅读 Kyle SimpsonYou Don't Know JS 系列。它适用于具有一定编程经验的人,但它们对于了解 JS 是什么和不是什么非常有用(无论堆放了多少语法糖)。 我特别推荐关注经典继承与 JavaScript 的OLOO (Objects Linking to Other Objects).987654324@的区别关键点

    介绍书Up & Going 是一本快速阅读书,涵盖了整个系列将深入探讨的基础知识。该系列的其余部分(到目前为止)包括:Types & GrammarScopes & Closuresthis & Object PrototypesAsync & PerformanceES6 & Beyond。你也可以在他的github repository上预览它们。

    您还可以查看 MDN 的 Working with Objects 文档以获取一些非常好的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      相关资源
      最近更新 更多