书上说:“JavaScript会为我们定义的每一个函数都创建一个原型对象”,那么这个原型到底在哪里呢?谢谢!

ATCG 2002-12-16 01:03:18
书上说:“JavaScript会为我们定义的每一个函数都创建一个原型对象”,
《JavaScript权威指南》,那么这个原型对象到底在哪里呢?谢谢!

如:
function myobject()
{
this.color='blue';
}
...全文
214 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
imafool 2003-05-10
  • 打赏
  • 举报
回复
我看了这本书,原型对象就是fn.prototype
你可以看到fn.prototype.constructor就是那个函数。
ATCG 2003-05-10
  • 打赏
  • 举报
回复
太感谢各位了!这个帖子我早该结了,当时一忙,有点忘了,SORRY,
一会儿就结贴!
ATCG 2002-12-19
  • 打赏
  • 举报
回复
感谢各位兄弟的帮助,我先仔细琢磨琢磨。
checkit 2002-12-18
  • 打赏
  • 举报
回复
//User define a function
function myClass()
{
//
}
//system create prototype for user class
//so do not need: myClass.prototype = new Object()
//you can:
myClass.prototype.newProperty = newValue;
//so prototype 就是你要問的原型對象
Lostinet 2002-12-18
  • 打赏
  • 举报
回复
倒..什么虚无飘渺啊?
prototype是通过constructor来访问的。

我上面的例子说得很清楚了。

还有.上面那个 myobject.prototype.size=xxx是错了。还没有测试过就搬上来,到底有没有实验精神啊。?

看这个:



//constructor:
function MyClass(passa)
{
//这个是通过constructor调用的时候初始化属性
this.a=passa;
}

//直接访问prototype,添加一个共享的属性
MyClass.prototype.shareV=5;

//函数定义的共享的方法
function MyClass.prototype.AlertV()
{
alert(this.shareV);
}

//下面是使用:

var my1=new MyClass(33);
alert(my1.a);//显示33
alert(my1.shareV);//显示5
my1.AlertV();//显示5
alert(my1.shaveV2);//显示undefined

//用my1得到constructor,得到prototype,修改和添加属性:
my1.constructor.prototype.shareV=55;
my1.constructor.prototype.shareV2=66;

alert(my1.shareV);//显示55
my1.AlertV();//显示55
alert(my1.shareV2);//显示66

var my2=new MyClass(77);
alert(my2.shareV);//显示55

my2.constructor.prototype.shareV=555;
alert(my1.shareV);//显示555

my2.shareV=5555;
alert(my1.shareV);//不影响,显示555;










llrock 2002-12-18
  • 打赏
  • 举报
回复
对不起楼主,我上面说的不正确,那时我个人的理解,我在一分帮助文件中找到了相关的一些解释,你看看吧〉〉〉
==================================================================
使用构造函数来创建对象
在 Microsoft JScript 中,可以使用构造函数来创建和生成对象类。您可以使用 new 语句来调用一个构造函数。该语句将返回其创建的内容。
Function 构造函数这个特例可用来创建匿名的函数。所谓匿名函数是指没有名称的函数。例如,可以使用 Function 构造函数来生成一个 “不工作”的函数,作为在另一个函数内的指示。这种函数只会从一个位置调用,不需要名称。

在下例中,这个匿名函数将生成一行“姓名和电子邮件地址”列表。该函数检查 firstNameFirst 变量的值来决定是先输入名还是姓,然后检查 emailNameFirst 变量的值来决定是先输入姓名还是电子邮件地址。该示例假定已在别的位置设置了firstNameFirst 和 emailNameFirst 的值。

for (j = 1; j < addressList[length]; j++)
{
oneListingLine = new Function(emailNameFirst, firstNameFirst, addressList, j, theName = new Function(firstNameFirst, addressList, j, var theName=(addressList[j].firstName + addressList[j].lastName);
if(firstNameFirst)
{
theName=(addressList[j].firstName + addressList[j].lastName);
},) ;
if (emailNameFirst)
{
theListing = addressList[j].emailName+ ":\t" + theName
} else theListing = theName + ":\t" + addressList[j].emailName; return theListing;)
document.write(oneListingLine + "<br>");
}

编写构造函数
要编写自己的构造函数,可以在构造函数中使用 this 关键字来引用新创建的对象。该构造函数将初始化该对象。
尽管在下面的示例中构造函数是从 0 索引开始的,但这并不是必选项。例如,如果希望某个参数指明数组或对象的实际索引数,您可以将 1 作为第一个索引开始。 在该示例中,该参数是 extent 来使其区别于由内置的 Array( ) 对象中自动维护的 length 参数。如果编写了给数组添加属性的代码,必需更新 extent 参数(或您自己的对应参数),因为该参数不是由 JScript 维护的。注意即使是这个极端简单的示例也使用了对象(点)和数组(方括号)的标注风格来引用当前对象。

function MakeStringArray(length) {
this.extent = length;
for (iNum = 0; iNum < length; i++) {
this[iNum] = "";
}
}

// 使用该构造函数来创建和初始化一个数组。
myStringArray = new MakeStringArray(63);

使用原型来创建对象
在编写对象定义时,可以使用 prototype 属性来创建由该定义生成且所有对象都具有的属性。原型属性将按引用复制给类中的每个对象,因此这一类中的所有对象的这个属性都相同。不过,可以在一个对象中更改原型属性的值,新的值将覆盖默认值,但仅在该实例中有效。属于这个类的其他对象不受此更改的影响。
使用这个原则,可以给 JScript 语言内部的对象定义附加属性,所有这些对象都具有原型。例如,如果要在计算中使用一个特殊的常数,而在 Math 和 Number 对象中提供的常数没有包括该常数,则可以自己定义,并对其指定各自的对象原型,或对象类的原型属性。

Math.prototype.Avogadro = 6.0232E23;
function howManyMolecules(wtGrams,molWt) {
return ((wtGrams/molWt)*Math.prototype.Avogadro);
}
document.write("There are " + howManyMolecules(window.prompt("How many grams?",0),window.prompt
("What's the molecular weight?",0)) +
" molecules in that amount.");

也许还需要指出的一点是,您可以定义一个函数,将其指定为 String.prototype 的一个方法,并在脚本的任何地方随字符串使用该函数。下面的示例假定已有一个在脚本的其他地方定义的、称为 "theElements" 的 元素周期表(Periodic Chart)数组,该数组中包含了元素的符号、名称、原子数以及其他相关信息。

function atomName(theSymbol) {
return(theElements[theSymbol].fullName);
}

String.prototype.atomName = atomName;

function decodeFormula(theFormula) {
var theCurrentPiece = "";
var theDecodedFormula = "";
for (i = 1; i = theFormula.length ; i++);
if (theFormtheCurrentPiece
// 将公式字符串分为符号和数字的数组。
// 循环该公式数组并装配拆开的字符串。每一项为:
theDecodedFormula += formula[n].number
theDecodedFormula += " ";
theDecodedFormula += formula[n].symbol.prototype.atomName;
theDecodedFormula += " "
// 循环结束。

return theDecodedFormula;
}

decodeFormula(window.prompt("Formula?","Al2O3"));

blues-star 2002-12-18
  • 打赏
  • 举报
回复
我认为原型对象是

function n()
{

}

部分代码在解释的时候在内存中的实例。
blues-star 2002-12-18
  • 打赏
  • 举报
回复
亦是个人理解,仅供参考。
blues-star 2002-12-18
  • 打赏
  • 举报
回复
既然是对象,那肯定已经实例出来了,也就是说放到内存中了,也就是说,我们每写一个function都要在内存中(解释的时候)分配空间,实例化(我想是由于解释性决定的,不能象编译式的那样)。

为什么叫原型呢?因为所有new一个function name出来的对象,都是将function预先解释的时候分配的对象copy过来,然后得到的,那个function可以说是个模型,所以叫原型。

又是原形,还是对象,所以是原形对象。
emu 2002-12-18
  • 打赏
  • 举报
回复
贴主的人缘可真好!
llrock 2002-12-18
  • 打赏
  • 举报
回复
回复人: ATCG(ATCG) ( ) 信誉:100 2002-12-17 21:13:00 得分:0


我创建了一个对象(构造函数),同时JavaScript为这个构造函数创建了原型对象
function myobject()
{
this.color='blue';
}

又创建了一个对象实例
myinstance = new myobject()

给原型对象添加属性
myobject.prototype.size = 10;

那么原型对象在哪里呢? 是myobject吗?
==================================
ATCG(ATCG) ( ) 首先,js没有重载,你的函数不叫做构造函数,在编译器编译之前她只是ASC码,当new的时候分配内存存放这个过程,然后this是指向这块内存的指针。"."是你可以间接访问这块内存。
你的MyObject不是所谓的原型,而只是原型的一个实例,它是只真正的原型是一个结构,这里js 隐藏了,new则起到了构造这个对象的角色。无论你new 与否,你的函数已经是一个实例对象,而并非一个类,它拥有prototype这个属性。就是这样了。
prototype既是真正原型的数据成员,下面的对比,你可以看到,实际上你通过prototype改编的是"函数"MyObject对象的结构,这是通过内联来实现的,于是你可以理解function MyObject 中function 是类名 MyObject是对象名,所谓的构造函数便是function类的构造函数。
function MyObject(){ | function MyObject(){}
this.method1=method1; | MyOject.prototype.method1=new Function(...)
this.property1='aaaa'; |
} |
function method1(){...} |


<<我的个人理解!>>


烂笔头Danky 2002-12-18
  • 打赏
  • 举报
回复
你既然说myobject.prototype.size = 10;这样是给原型对象添加属性了,那原型对象不就是myobject了吗!
ATCG 2002-12-17
  • 打赏
  • 举报
回复
我创建了一个对象(构造函数),同时JavaScript为这个构造函数创建了原型对象
function myobject()
{
this.color='blue';
}

又创建了一个对象实例
myinstance = new myobject()

给原型对象添加属性
myobject.prototype.size = 10;

那么原型对象在哪里呢? 是myobject吗?

emu 2002-12-17
  • 打赏
  • 举报
回复
>原型和原型对象是两个概念

那么原型就是面向对象理论中的概念,而原型对象则是prototype了。那我们到底在讨论的是哪个呢?
ATCG 2002-12-17
  • 打赏
  • 举报
回复
TO: danky() ,你好!
你这样说我能理解,不过我总觉得还不完全是这样。请看这句话:
“JavaScript会为我们定义的每一个函数都创建一个原型对象”,那么如果我
定义了一个函数,同时JavaScript又自动创建了一个原型对象,我彷佛觉得原型
对象是函数的一个COPY。但是我不知道它在哪里。
在《JavaScript权威指南》里说道:“构造函数的原型对象是由JavaScript
自动创建的。在大多数JavaScript版本终,它都会给予每个函数一个空的原型对象,以防止它被用作一个构造函数,但是在Navigator 3 中,在函数首次被用作
构造函数之前, 是不会为它创建原型对象的。”

如此说来,我觉得原型对象和构造函数应该是两个东东?
ATCG 2002-12-17
  • 打赏
  • 举报
回复
按照我的理解,原型和原型对象是两个概念.
构造函数和原型对象也应该是有各自的内存区,是孪生兄弟?
我知道构造函数在哪里,能看得见.
可是我不知道原型对象在哪里,就像那空中的楼阁虚无飘渺.
虽能告诉我啊?
emu 2002-12-17
  • 打赏
  • 举报
回复
我认为,构造函数在构造对象的时候才起作用,一次性的赋与新构造的对象的属性和方法。原型对象则影响所有以指定方式构造出来的对象,不管这些对象是在原型对象被修改之前还是之后构造的。
emu 2002-12-17
  • 打赏
  • 举报
回复
>>如此说来,我觉得原型对象和构造函数应该是两个东东

虽然它们在作用上也许有交叉点,但它们确实是两个东东。

xdspower的解释我认为不是很对。在js中我们说原型是特指protytype这个对象,不一定是由我们自己“定义描述的”。对它进行访问也不是通过构造函数。我想他指的是面向对象理论中谈论的原型吧。


烂笔头Danky 2002-12-17
  • 打赏
  • 举报
回复
我来补充一点吧,请先看看 llrock(百乐宝||昨夜星辰)的,就 llrock(百乐宝||昨夜星辰)所说的,除了JS本身内置的对象外,还有你自己用function创建的对象也可以作为对象的原型(或者说也有他的原型),如:

function myobject()
{
this.color='blue';
}
var t = new myobject();

这样myobject就是对象t的原型了,简单地也可以说原型就是创建对象的来源吧!怎样,希望你能明白吧!
ATCG 2002-12-17
  • 打赏
  • 举报
回复
你的意思是只有构造函数才会生成原型对象,那么原型对象和构造函数是不是就是
一回事呢?或者说构造函数和原型对象是两个内存区,但内容一样?还是不甚理解。唉!
加载更多回复(8)

87,914

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧