我有一个关于 javaScript 函数的问题。考虑以下两个函数定义:
// run time definition
var foo_1 = function () {
console.log("I ma foo 1");
}
// parse time definition
function foo_2 () {
console.log("I ma foo 2");
}
既然在 javaScript 中一切都是对象,那么在前面的代码中是否创建了两个名为 foo_1
和 foo_2
的新对象?如果是,它们的原型(prototype)对象是什么,这些对象是什么时候创建的?
我也在努力理解 var obj={}
和 var foo=function(){}
之间的真正区别,两者都是对象,但第一个有“type”Object
,而第二个具有 function
类型。它是否正确?
根据我的书“JavaScript the good part”,每个新的文字对象都链接到 Object.prototype
,默认情况下它是一个空对象。为了验证此行为,我尝试运行以下脚本:
Object.prototype
//Object {}
Object.prototype = { name: "This is an experiment"};
//Object {name: "This is an experiment"}
function test() { conosle.log("Test"); }
test.prototype;
//Object {}
为什么 test.prototype
的结果是一个空对象?
最后,我想知道这些函数定义是否等同于下面的代码:
this.foo = function() {
console.log("I ma foo");
}
如果是这样,this
是什么?
最佳答案
Why the result of test.prototype is an empty object?
所有函数都有一个prototype
属性,最初引用一个空对象。
定义:(resig)
Prototypes are used throughout JavaScript as a convenient means of defining properties and functionality that will be automatically applied to instances of objects.
您设置了 Object 的 prototype
值,而不是用于 test
函数。
在 JS 中 - 每个对象 - 继承 Object.prototype
。
如果您已将函数附加到 Object.prototype
- 如您所愿:
Object.prototype.name = function (){alert(1);};
function test() { console.log("Test"); }
var a = new test();
a.name();
它会提醒 1
编辑
关于您的评论:
我们真正想要实现的是一个原型(prototype)链,这样一个Player 可以是一个人,一个人可以是一个哺乳动物,一个哺乳动物可以是一个 Animal等等,一直到Object。最好的技术 创建这样的原型(prototype)链是使用对象的实例作为 另一个对象的原型(prototype):
SubClass.prototype = new SuperClass();
考虑这段代码:
function Person(){}
Person.prototype.dance = function(){};
function Player(){}
Player.prototype = new Person(); <------
var player = new Player();
assert(player instanceof Player,"player receives functionality from the Player prototype");
assert(player instanceof Person, "... and the Person prototype");
assert(player instanceof Object, "... and the Object prototype");
assert(typeof player.dance == "function", "... and can play!")
注意的那一行是让你从人中创造出一个玩家的东西(你会看到那个玩家是一个人的实例!):
关于javascript - 在 javaScript 中声明函数时使用的原型(prototype)是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889423/