读书人

javascript的值,对象,原形

发布时间: 2012-11-23 22:54:33 作者: rapoo

javascript的值,对象,原型

探讨一下,如有纰漏请指正.

认识在前面:先给出我们讨论的结果

===========================================

javascript是基于原型(prototype-based)的语言.

javascript具有面向对象(Object-Oriented)的编程风格.

变量不一定是对象(undefined,null等就是特例,但是NaN是个对象)

对象一定有值,也有成员(函数,属性)

Object不是顶级的,因为可以delete Object

顶级的有:

Array Object
Boolean Object
Date Object
Function Object
Math Object
Number Object
RegExp Object
String Object

new运算符具有一定的魔术性,这个说法我语言上还组织不好.

==========================================

首先我用了词:原型

马上您就知道为什么这么说了.

javascript是基于对象(Object-based)的吗?不是

javascript是面向对象(Object-Oriented)的吗?,要清楚这句话指的是编程方法类似面向对象的编程,但是也有很多不同的地方.

那我们看看Mozilla官方的说法


嘻嘻,都说了E文不好了.
Aiming也是E文表示的吧!
javascript的实体书只看过一本,Ajax and REST Recipes
还感觉对自己没有什么帮助(因为偶有自己完整的解决方案),所以就不再买了.
失误呀!
嘻嘻,都说了E文不好了.
Aiming也是E文表示的吧!
javascript的实体书只看过一本,Ajax and REST Recipes
还感觉对自己没有什么帮助(因为偶有自己完整的解决方案),所以就不再买了.
失误呀!

为啥我刚说到这本书就有看似枪文的东西出现......
http://www.iteye.com/topic/206407JSBooljs_InvokeConstructor(JSContext *cx, jsval *vp, uintN argc){ JSFunction *fun; JSObject *obj, *obj2, *proto, *parent; jsval lval, rval; JSClass *clasp, *funclasp; fun = NULL; obj2 = NULL; lval = *vp; if (!JSVAL_IS_OBJECT(lval) || (obj2 = JSVAL_TO_OBJECT(lval)) == NULL || /* XXX clean up to avoid special cases above ObjectOps layer */ OBJ_GET_CLASS(cx, obj2) == &js_FunctionClass || !obj2->map->ops->construct) { fun = js_ValueToFunction(cx, vp, JSV2F_CONSTRUCT); if (!fun) return JS_FALSE; } clasp = &js_ObjectClass; if (!obj2) { proto = parent = NULL; fun = NULL; } else { /* * Get the constructor prototype object for this function. * Use the nominal 'this' parameter slot, vp[1], as a local * root to protect this prototype, in case it has no other * strong refs. */ if (!OBJ_GET_PROPERTY(cx, obj2, ATOM_TO_JSID(cx->runtime->atomState .classPrototypeAtom), &vp[1])) { return JS_FALSE; } rval = vp[1]; proto = JSVAL_IS_OBJECT(rval) ? JSVAL_TO_OBJECT(rval) : NULL; parent = OBJ_GET_PARENT(cx, obj2); if (OBJ_GET_CLASS(cx, obj2) == &js_FunctionClass) { funclasp = ((JSFunction *)JS_GetPrivate(cx, obj2))->clasp; if (funclasp) clasp = funclasp; } } obj = js_NewObject(cx, clasp, proto, parent); if (!obj) return JS_FALSE; /* Now we have an object with a constructor method; call it. */ vp[1] = OBJECT_TO_JSVAL(obj); if (!js_Invoke(cx, argc, JSINVOKE_CONSTRUCT)) { cx->weakRoots.newborn[GCX_OBJECT] = NULL; return JS_FALSE; } /* Check the return value and if it's primitive, force it to be obj. */ rval = *vp; if (JSVAL_IS_PRIMITIVE(rval)) { if (!fun) { /* native [[Construct]] returning primitive is error */ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_NEW_RESULT, js_ValueToPrintableString(cx, rval)); return JS_FALSE; } *vp = OBJECT_TO_JSVAL(obj); } JS_RUNTIME_METER(cx->runtime, constructs); return JS_TRUE;} 10 楼 achun 2008-06-21 <div class='quote_title'>csf178 写道</div>
<div class='quote_div'>还有个小细节 其实<br/>alert({}.constructor);在FF里也是可以的<br/>{}.constructor;会有问题也是因为词法冲突 {}不在表达式中的时候会被认作语句块(而不是对象构造)<br/></div>
<p><br/><a href='http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Literals' target='_blank'>Object Literals</a> 中</p>
<div class='quote_title'> 写道</div>
<div class='quote_div'>An object literal is a list of zero or more pairs of property names and associated values of an object, enclosed in curly braces ({}). You should not use an object literal <strong>at the beginning of a statement</strong>. This will lead to an error or not behave as you expect, because the { will be interpreted as the beginning of a block.</div>
<p>?明确了这种用法是会产生错误的.这种用法也就成了语法错误了,也就是你说的解析时候造成<strong>词法冲突</strong></p>
<p>?</p> 11 楼 csf178 2008-06-21 <div class='quote_title'>achun 写道</div>
<div class='quote_div'>
<div class='quote_title'>csf178 写道</div>
<div class='quote_div'>还有个小细节 其实<br/>alert({}.constructor);在FF里也是可以的<br/>{}.constructor;会有问题也是因为词法冲突 {}不在表达式中的时候会被认作语句块(而不是对象构造)<br/></div>
<p><br/><a href='http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Literals' target='_blank'>Object Literals</a> 中</p>
<div class='quote_title'>写道</div>
<div class='quote_div'>An object literal is a list of zero or more pairs of property names and associated values of an object, enclosed in curly braces ({}). You should not use an object literal <strong>at the beginning of a statement</strong>. This will lead to an error or not behave as you expect, because the { will be interpreted as the beginning of a block.</div>
<p>?明确了这种用法是会产生错误的.这种用法也就成了语法错误了,也就是你说的解析时候造成<strong>词法冲突</strong></p>
<p>?</p>
</div>
<p>嗯 是这个意思</p>
<p>另外 其实constructor并不是很准 因为constructor可以被修改</p>
<p>在FF中 __proto__ 属性是原型链</p>
<p>var t={__proto__:{a:1,b:2},c:3}</p>
<p>alert(t.a);//1</p>
<p>alert(t.b);//2</p>
<p>alert(t.c);//3</p>
<p>?</p>
<p>在JS中 new和函数的prototype可以看作是提供了一种用原型模拟类的方式 </p>
<p>把拥有同一个原型的一组对象看作属于一个类</p>
<p>?</p> 12 楼 soni 2008-06-25 lz想要说什么? 13 楼 achun 2008-06-25 <div class='quote_title'>soni 写道</div>
<div class='quote_div'>lz想要说什么?</div>
<p>我想搞清楚几件事情,经过csf178的讨论,已经清楚了.就几句话.</p>
<p>?</p>
<p>javascript是基于原型(<strong>prototype-based</strong>
)的语言.</p>
<p>javascript具有面向对象(<span style='color: #000000;'><strong>Object-Oriented</strong>
</span>
)的编程风格.</p>
<p><strong>变量不一定是对象(undefined,null等就是特例,但是NaN是个对象)</strong></p>
<p><strong>对象一定有值,也有成员(函数,属性)</strong></p>
<p><strong>Object不是顶级的,因为可以delete Object</strong></p>
<p><strong>顶级</strong>的有:</p>
<p style='background-color: #ffffff; padding-left: 30px;'> <strong><span style='color: #000000;'>Array Object<br/>Boolean Object<br/>Date Object<br/>Function Object<br/>Math Object<br/>Number Object<br/>RegExp Object<br/>String Object</span></strong></p>
<p><strong>new</strong>运算符具有一定的<strong>魔术性,这个说法我语言上还组织不好.</strong></p> 14 楼 soni 2008-06-25 什么叫顶级的?是不是就是语言内建的叫顶级的? 15 楼 achun 2008-06-25 <div class='quote_title'>soni 写道</div>
<div class='quote_div'>什么叫顶级的?是不是就是语言内建的叫顶级的?</div>
<p><br/>我也是这么理解的.不过还是用官方的说法比较合适.<br/><a href='http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Predefined_Core_Objects' target='_blank'>Predefined Core Objects</a></p>
<p>预定义核心对象,</p>
<p>问题是内建这个词没有一个定义,Object是系统一运行就建立的,算不算内建呢?</p>
<p>但是Objcet肯定不算Core Objects,因为官方列表中就没有.</p>
<p>?</p> 16 楼 csf177 2008-06-25 <div class='quote_title'>achun 写道</div>
<div class='quote_div'>
<div class='quote_title'>soni 写道</div>
<div class='quote_div'>什么叫顶级的?是不是就是语言内建的叫顶级的?</div>
<p><br/>我也是这么理解的.不过还是用官方的说法比较合适.<br/><a href='http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Predefined_Core_Objects' target='_blank'>Predefined Core Objects</a></p>
<p>预定义核心对象,</p>
<p>问题是内建这个词没有一个定义,Object是系统一运行就建立的,算不算内建呢?</p>
<p>但是Objcet肯定不算Core Objects,因为官方列表中就没有.</p>
<p>?</p>
</div>
<p>好像没什么区别吧 这些都可以delete</p>
<p>Moz写的文档只是把Object单拿出来说了</p>
<p>?</p>
<p>不管怎么说ECMA现在比Moz更官方 ECMA现在是把它们放一起的</p> 17 楼 achun 2008-06-26 <p>还真的是实现有很大却别呀,<br/>Moz和IE的实现当中</p>
<pre name='code' class='js'>delete Object;
alert(typeof Object);
delete Function;
alert(typeof Function);</pre>
<p>?还真不一样.这个世界可真乱呀!</p>
<p>?</p> 18 楼 csf177 2008-06-26 ECMA对这个倒是没明确规定
但是按照ECMA262的意思 Object Function Array等并非GlobalObject的特权属性 所以应该都可以正确删除
所以虽然标准没有明确的规定 也不应该认为是implementation dependent的

FireFox在此处显然属于实现错误
因为alert(delete Function);是true

说实话 如果你读了SpiderMonkey源码 你会对它有很深的绝望

读书人网 >JavaScript

热点推荐