如何创建函数的原型?

时间:2016-09-18 21:05:24

标签: javascript prototype

function Circle(radius) {
    this.radius = radius;
}

我试图通过玩控制台来理解对象和原型。当我试着" Circle"时,它给了这个功能。但是,当我尝试Circle.prototype时,它给了一个对象。 Circle是如何获得原型属性的。它有构造函数和Object的原型。有人可以解释这个heirarchy

enter image description here

4 个答案:

答案 0 :(得分:2)

当您创建新函数时,JS将使用属性名称,长度和原型创建新的函数对象。名称是函数名称,length是参数的数量,prototype是对JS创建的新对象的引用,该对象使用引用第一个函数对象的构造函数属性。因此,在创建函数时,实际上创建了2个新对象,即函数对象和原型对象。

有关详细信息,请参阅此30分钟讲座:

http://www.objectplayground.com/

如果您只想要功能部分,请转到16:40分钟。

答案 1 :(得分:1)

我认为当你读到有人写“每个对象都有一个原型属性”时会产生误解。

函数在Javascript中是对象。与每个对象一样,函数具有一些属性和方法,其中一些默认定义:length属性,prototype属性,call()apply()和bind()方法等。因此,默认情况下,函数具有prototype属性

function myfunc(){
   return "yes I'm a function";
}

//I said that function are objects having properties and methods
//this means you can call them, for example
myfunc.prototype 

并且您将看到从调用此属性返回的值是一个对象。好的,暂时关注这里的功能。

现在,您可以使用任何函数作为构造函数,因此您可以创建一个新对象,并使用new关键字调用该函数

var myobj = new myfunc()

你将有一个新对象。该对象默认情况下没有原型属性

myobj.proptotype //=> unefined

我们不能说对象的原型属性:函数有原型属性,对象没有。

但是,每个对象都与一个原型对象相关联,从中继承了属性和方法。你想看看原型对象的价值是什么吗?其中一个解决方案是

myobj.__proto__

您将看到自定义对象的原型对象的值。

现在,看一下myobj.__proto__的值和myfunc.prototype的值:它们是相同的。这只是意味着构造函数的prototype属性(换句话说,与new关键字一起使用以创建新对象的函数的prototype属性)被用作新对象的原型。

记住这一点。

函数是对象,因此默认情况下函数具有属性和方法。

函数具有原型属性。

使用函数作为构造函数来创建新对象。

对象没有原型属性。

对象有一个原型对象。

原型对象值与构造函数的prototype属性相同。

答案 2 :(得分:0)

要使用代码创建圈子,您可以使用new Circle(10);,或者如果您想稍后使用该圈子,var circ = new Circle(10);。这将创建一个新的圆形对象供您根据需要使用。

Circle是一个函数,另一种变量或对象。您设置Circle,现在当您键入Circle时,它将返回该功能本身。不是一个新的圈子。每个函数都有一些属性,prototype就是其中之一。

prototype对象是每个函数的一部分,用于处理类。你可以阅读它here

答案 3 :(得分:0)

在Javascript中,函数是一个对象。每个对象都有一个秘密"原型属性附加到它。 在你的情况下,Circle的原型是Function的原型,因为Circle是一个函数。 每个对象派生自的根对象是Object对象,因此如果您可以走到原型链直到到达Object对象。 如果您打算使用Cirle作为构造函数并使用new调用它,这意味着您将创建其他将成为Circle实例的对象,并且它们的原型将指向Circle.prototype。 有关原型如何工作的更详细说明,在线有非常好的资源。 例如,您可以阅读:http://eloquentjavascript.net/关于数据结构的章节:对象和数组。

您可以通过执行Object.getPrototypeOf(Circle)来检查Circle的原型,以确认这将是Function原型。