Javascript - Object.getOwnPropertyNames不显示构造函数属性

时间:2013-07-02 23:20:26

标签: javascript

为什么" numMyNumber"没有出现在Object.getOwnPropertyNames?

在Firefox中使用FireBug控制台。

"use strict";

// MyFunction
function MyFunction() {
   var numMyNumber = 10;
   return numMyNumber;
}

// ["prototype", "length", "name", "arguments", "caller"]
// Why does numMyNumber not appear?
console.log(Object.getOwnPropertyNames (MyFunction)); 

// 10
console.log(MyFunction());

3 个答案:

答案 0 :(得分:7)

numMyNumber本地变量 它不是该功能的属性。

要创建函数的属性,您需要在函数上创建属性,就像任何其他对象一样:

MyFunction.someProperty = 42;

请注意,函数的属性绝不是特定调用的本地属性。

答案 1 :(得分:0)

// MyFunction
function MyFunction() {
   this.numMyNumber = 10;
return this.numMyNumber 


}
// ["prototype", "length", "name", "arguments", "caller"]
// Why does numMyNumber not appear?
alert(Object.getOwnPropertyNames ( new MyFunction)); 

// 10
alert(MyFunction());

1)您需要使用 this 将变量设为属性

2)您需要使用 new 来创建新的类实例

答案 2 :(得分:0)

澄清其他答案;函数声明,函数创建的实例和函数原型之间存在差异。我希望以下代码能够证明:

//declararion:
function Person(name){
  this.name=name
}
// sayName is a method of a person instance like jon.sayName
Person.prototype.sayName=function(){
  console.log("Hi, I'm "+Person.formatName(this.name));
};
// static property of Person to format name
Person.formatName=function(name){
  return name.toLowerCase().replace(/\b\w/g,function(){
    return arguments[0].toUpperCase();
  });
};

// now we create an instance of person
var jon = new Person("jon holt");
jon.sayName();//=Hi, I'm Jon Holt
// next line's output:  
//["prototype", "formatName", "length", "name", "arguments", "caller"]
console.log(Object.getOwnPropertyNames(Person));
// name in Person isn't the same as name in jon
console.log(Person.name);//=Person
// next line's output: ["name"], name here would be jon holt
console.log(Object.getOwnPropertyNames(jon));
// next line's output: ["constructor", "sayName"]
console.log(Object.getOwnPropertyNames(Person.prototype));

以下是使用函数构造函数,原型和继承的一些方法的链接:Prototypical inheritance - writing up