我不知道如何问这个问题,如果已经提出问题我会道歉,但我找不到它或答案。
将函数分配给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”的属性?为什么当我尝试为该属性赋值时,它是否会被分配?
答案 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