javascript - 在 javaScript 中声明函数时使用的原型(prototype)是什么

标签 javascript function

我有一个关于 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_1foo_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.

您设置了 Objectprototype 值,而不是用于 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!")

注意的那一行是让你从人中创造出一个玩家的东西(你会看到那个玩家是一个人的实例!):

enter image description here

http://jsbin.com/oNixIMo/8/edit

关于javascript - 在 javaScript 中声明函数时使用的原型(prototype)是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889423/

相关文章:

javascript - 对象 #<Object> 没有方法 'draggable'

javascript - 如何使用 jquery map ?

javascript - 如何压缩相似的重复jquery函数

Python eval 在函数内部不起作用

c++ - const 和非常量函数的重载如何工作?

javascript - 如何排除具有某些属性的元素?

javascript - 将多个数据条目存储到 javascript 对象中?

c++ - 如何将对象作为参数传递给类

C 传递数组的大小

c++ - 为什么我们在 C++ 中分别声明和定义函数?