Javascript对象:从对象构造函数返回的内容

时间:2011-09-23 17:46:59

标签: javascript function

我不知道如何问这个问题,如果已经提出问题我会道歉,但我找不到它或答案。

将函数分配给var。

时返回的内容
    var obj = function(){
        this.name = 'Steve';
    }
    alert( obj.name === '');//true
    obj.name = 'Mike';
    alert( obj.name === '');//true
    obj.foo = 'fall';
    alert( obj.foo );//fall

我知道obj现在是一个函数/对象,我可以调用obj()。我也知道附加到obj的函数是obj类型的新对象的构造函数。如果我做

var newObj = new obj();
alert( newObj.name );//Steve

“史蒂夫”被打印出来。等等。

为什么obj似乎附加了一个名为“name”的属性?为什么当我尝试为该属性赋值时,它是否会被分配?

3 个答案:

答案 0 :(得分:5)

因为函数对象具有name属性(顺便说一下是非标准的),表示函数的“名称”,所以函数显示一个空字符串("")作为值这个属性,因为它是匿名的。

例如,如果您声明一个名为foo的函数:

function foo() {}
foo.name; // "foo"


var anon = function () {};
anon.name; // "", an anonymous function

var namedFunctionExpr = function bar () {};
namedFunctionExpr.name; // "bar"

同样如你所知,你不能改变这个属性的值,因为在大多数实现中,它是不可配置的,不可枚举的和不可写的:

Object.getOwnPropertyDescriptor(function x(){}, 'name'); 
/* logs:
{ 
  configurable: false,
  enumerable: false,
  value: "x",
  writable: false
}
*/

请记住,此属性是非标准,并且有一些实现不支持它(例如,所有IE JScript版本都不支持它)

现在正如@Felix建议的那样,我想补充说this.name与您的函数name属性没有任何关系。

在您的示例中,将obj函数作为构造函数(使用new运算符)调用,将this值设置为新创建的对象,该对象继承自函数的原型,并且您正在为此新对象分配name属性的值。

答案 1 :(得分:1)

如果没有用函数构造对象的实例,使用obj.name,你只需要读取函数的name属性。

您实际上可以使用语法

显式命名函数
function foo(){

}
你可以做点什么:

var goo = function foo() {}

goo.name实际上会读取"foo"

此处的声明未命名:

var obj = function(){
        this.name = 'Steve';
    }

所以obj.name始终是空字符串。

您可以在此处阅读更多内容:

http://bonsaiden.github.com/JavaScript-Garden/#function

但是,如果使用new调用该函数,则会获得通过构造函数创建的对象的实例,并完成通过原型链继承的所有内容。

但值得注意的是,您实际上可以从构造函数返回任何对象。默认情况下,它返回一个对象的实例,但您可以轻松地返回一个不同的对象,该对象自然不具有原型中的任何属性。

即:

function Dog() {
   this.bark = "bark!";
   return { bark: "quack"};
}

var weirdDog = new Dog();

不会有weirdDog.bark === "bark"

同样,您可以在Javascript Garden网站上阅读更多信息。

答案 2 :(得分:0)

“name”属性返回函数的名称,您无法设置它,因为它是readonly属性。它返回空白,因为你的函数是匿名的。

更好地查看此链接以获取更多详细信息:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Name