function Circle(radius) {
this.radius = radius;
}
我试图通过玩控制台来理解对象和原型。当我试着" Circle"时,它给了这个功能。但是,当我尝试Circle.prototype时,它给了一个对象。 Circle是如何获得原型属性的。它有构造函数和Object的原型。有人可以解释这个heirarchy
答案 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原型。