我正在学习面向对象的javascript,来自Object Palyground
根据教程,函数本身被视为一个对象,我知道你可以在javascript中使用 in 关键字获取对象的属性
var obj = {a:"hello",b=123};
for(var prop in obj)
alert(var);
上面的代码为我提供了函数对象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);
它没有给我任何输出,理想情况下根据教程,函数对象应该包含三个属性:name,length和prototype 但是我没有,我做错了
请帮助我
答案 0 :(得分:4)
我做错了
for...in
仅针对可枚举属性进行迭代。本机对象的默认属性通常是不可枚举的。
您可以使用Object.getOwnPropertyNames
获取函数对象的属性列表:
> Object.getOwnPropertyNames(function() {})
["length", "name", "arguments", "caller", "prototype"]
或者,如果您只想检查属性以进行学习,请使用console.dir
记录该功能:
答案 1 :(得分:0)
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 ] );
}
如果以静态方式使用它,则不必执行此功能。 也不是那个对象没有length方法。阵列。
为了使这个非常简单,并且完全不准确,{}(对象)有点静态,而function(){}是不可变的(这个词是否存在?),这意味着你可以使用“new”,因此受益于函数构造函数。
这一切都非常技术性,看起来你开始使用javascript。告诉我,如果我不清楚或你需要一些精确度。
希望有所帮助。
答案 2 :(得分:0)
JavaScript中的Function
可以称为"第一类"因为它是一个可调用对象,这意味着它是一个添加了可调用语义的对象。在某些方面,JavaScript中的Array
类似于Function
,因为它们都是对象,但包含特殊功能。 注意:关于JavaScript的一个常见陈述是"everything is an object",但事实并非如此。 简单原语(string
,boolean
,number
,null
和undefined
)都不是对象(尽管JS确实如此)如果你试图对待它们,可以采取一些巧妙的技巧。
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
。
现在让我们看一下bar
中的func
。
func.propertyIsEnumerable('bar'); // true
这就解释了bar
显示func
的原因,但name
呢?
func.propertyIsEnumerable('name'); // false
AHAH!它不是可枚举的。对于通过JavaScript引擎自动链接或分配给对象的许多属性/方法都是如此。例如,数组对象的length
属性。
arr.propertyIsEnumerable('length'); // false
大家都说过,如果你是JS的新手,我强烈建议你按Kyle Simpson阅读 你不知道JS 系列。它适用于具有一定编程经验的人,但它们对于学习JS是什么以及它不是什么非常有用(无论多少语法糖堆积)。 我特别建议关注经典继承与JavaScript OLOO (Objects Linking to Other Objects).
之间差异的关键点介绍书Up & Going是一本快速阅读,涵盖了整个系列将深入研究的基础知识。本系列的其余部分(目前为止)包括:Types & Grammar,Scopes & Closures,this & Object Prototypes,Async & Performance和ES6 & Beyond。您也可以在github repository上预览所有内容。
OR 您还可以查看MDN的Working with Objects文档,了解一些非常好的信息。