`
pouyang
  • 浏览: 321587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript语言精粹 对象(检索,原型prototype)

阅读更多
对于丑陋的事物,爱会闭目无视

JavaScript中的对象是可变的键控集合(keyed collections)
对象是属性的容器,其中每个属性都拥有名字和值。属性的名字可以是
包括字符串在内的任意字符串,属性值可以是除undefined值之外的任何值

JavaScript中的对象是无类别的,它对新属性的名字和值没有约束。对象适合
用于收集和管理数据。对象可以包含其他对象,所以它们可以容易地表示成
树形或图形结构(注意:树和图强大的数据结构)

JavaScript包括一个原型链特性,允许对象继承另一对象的属性。正确地使用它能
减少对象初始化的时间和内存消耗


对象检索

var empty_object = {};
var stooge = {
	"first-name":"Ouyang",
	"last-name":"ping",
	"yyl":"yyl"
}
alert(stooge["first-name"]); //Ouyang
alert(stooge.first-name);//NaN
alert(stooge.yyl)//yyl
alert(stooge.name);//undefined


||运算符可以用来填充默认值
var middle = stooge["middle-name"] ||"none";

flight.equipment // undefined
flight.equipment.model // throw "TypeError"
flight.equipment && flight.equipment.model //undefined


原型

返回对象类型原型的引用。

objectName.prototype

objectName 参数是对象的名称
原型连接在更新时是不起作用的,当我们对某个对象做出改变时,不会触及到该对象
的原型,原型连接只有在检索值的时候才被用到,如果我们尝试去获取对象的某个属性,且
该对象没有此属性,那么JavaScript会试着从原型对象中获取属性值。如果那个原型对象也
没有该属性,那么再从它的原型中寻找,依次类推,直到该过程最后到达
终点Object.prototype,如果想要的属性完全不存在于原型链中,那么结果就是
undefied值,这个过程成为委托。

function TestObjectA() 
{ 
    this.MethodA = function() 
    { 
       alert('TestObjectA.MethodA()'); 
    } 
} 

function TestObjectB() 
{ 
	this.bb = 'ccc';
    this.MethodB = function() 
    { 
       alert('TestObjectB.MethodB()'); 
    } 
} 

TestObjectB.prototype = new TestObjectA(); //TestObjectB继承了 TestObjectA的方法

TestObjectB.prototype.bb = 'aaaaa'; //添加属性
var temp
var b = new TestObjectB();
for (temp in b) {
  alert(temp); // MethodA  bb MehtedB
}
var kk = new TestObjectB();
//删除,但原型链中的没有删除
alert(kk.bb); // ccc
delete kk.bb;
alert(kk.bb); // aaaa

alert(kk.MethodA()); //TestObjectA.MethodA()


此处转载 http://fengsky491.iteye.com/blog/228583 谢谢 fengsky491
JScript里的prototype,为什么我们说它和prototype pattern里的prototype不一样呢?! 这个不是我说就说出来的,也不是我吹出来的,看看这个示例,你就能大概糊涂: 
 <script language="javascript">
function RP() 
{ 
    RP.PropertyA = 1; 
    RP.MethodA = function() 
    { 
         alert("RP.MethodA "); 
    }; 
    
    this.PropertyA = 100; 
    this.MethodA = function() 
    { 
         alert("this.MethodA"); 
    }; 
} 

RP.prototype.PropertyA = 10; 
RP.prototype.MethodA = function() 
{ 
    alert("RP.prototype.MethodA"); 
}; 
</script> 
   不要着急,还没有开始做示例,只是给出了我们用来演示的一个类。RP是什么?rpwt吗?当然不是了,RP是ResearchPrototype了。好了不废话了,看示例及结果分析。  
<script language="javascript"> 
rp = new RP(); 
alert(RP.PropertyA); 
RP.MethodA(); 
alert(rp.PropertyA); 
rp.MethodA(); 
</script> 
    运行结果闪亮登场: 
   1 
   RP.MethodA 
   100 
   this.MethodA 
    这个%$@#^$%&^...,不要着急,继续看哦! 


<script language="javascript"> 
rp = new RP(); 
delete RP.PropertyA; 
alert(RP.PropertyA); 
delete RP.MethodA; 
RP.MethodA(); 
delete rp.PropertyA; 
alert(rp.PropertyA); 
delete rp.MethodA; 
rp.MethodA(); 
</script> 
    运行结果再次登场: 
   undefined 
   A Runtime Error has occurred. 
   Do you wish to Debug? 
   Line: 32 
   Error: Object doesn't support this property or method 
   10 
   RP.prototype.MethodA 

    好玩吧,看出来什么名堂了吗?这里的RP.PropertyA和RP.MethodA只是用来做参照的,可是怎么把this.PropertyA和this.MethodA都delete了,还能出来结果,而且还是prototype导入的属性和方法呢?

    这就是JScript的prototype和prototype pattern中prototype最大的不同了,JScript中的这个所谓的prototype属性其实是个语言本身支持的特性,这里没有发生任何的copy,不管shallow还是deep的。对于JScript的解释引擎,它在处理"."或"[keyName]"引用的对象的属性和方法时,先在对象本身的实例(this)中查找,如果找到就返回或执行。如果没有查找到,就查找对象的prototype(this.constructor.prototype)里是否定义了被查找的对象和方法,如果找到就返回或执行,如果没有查找到,就返回undefined(对于属性)或runtime error(对于方法)。

    正因为prototype导入类实例的属性或方法是动态查找的,所以我们才能对系统内部对象添加prototype属性和方法,比如给String对象添加trim方法:

<script lanuage="javascript"> 
String.prototype.trim() 
{ 
    return this.replace(/(^\s+)|(\s+$)/g, ""); 
} 
</scritp> 
 
  显然JScript中的这种用法也是prototype pattern中的prototype不能解释和支持的。

    这下对于JScript OOP中原型继承法的理解因该没有任何的障碍了吧?同时也应该明白为什么原型继承法有那么大的天生缺陷了吧?当然如果有任何问题,欢迎继续讨论。



反射

检查对象并确定对象有什么属性是很容易的事情,只要试着去检索
该属性并验证取得的值,typeof操作符对确定属性的类型很有帮助。


typeof flight.number


另一个方法是使用hasOwnProperty方法,如果对象拥有独有的属性,它将返回true.
hasOwnProperty方法不会检查原型连


flight.hasOwnProperty('nubmer');





枚举(对象属性)
for in 语句可用来遍历一个对象中的所有属性名,该枚举过程将会列出所有的属性
包括函数和你可能不关心的原型中的属性,所以有必要过滤掉那些你不想要的值。最为常用
的过滤器是hasOwnProperty方法,以及使用typeof来排除函数:

var name;
for (name in another_stooge) {
	if (typeof another_stooge[name] != 'function') {
		document.writeln(name+':'+another_stooge[name]);
	}
}


属性名出现的顺序是不确定的,因此要对任何可能出现的顺序有所准备,如果你想要确保属性以特定的顺序出现,
最好的办法就是完全避免使用 for in语句,而是创建一个数组,在其中以正确的顺序包含属性名
var i ;
var properties = [
	'first-name',
	'middle-name',
	'last-name',
	'profession'
];
for (i = 0 ; i < properties.length; i += 1) {
	document.writeln(properties[i]+':'+another_stooge[properties[i]]);
}
通过使用for而不是for in ,可以得到我们想要的属性,而不用担心可能发掘出原型链中的属性,并且我们按
正确的顺序取得了它们的值。

分享到:
评论

相关推荐

    《JavaScript语言精粹》.pdf

    《JavaScript语言精粹》这本书是深入理解这一语言的宝贵资源,它涵盖了JavaScript的核心概念和技术,旨在帮助读者掌握这门语言的精髓。 在描述中提到的"JavaScript语言精粹 包含pdf 与 epub"表明,这本书提供了两种...

    JavaScript语言精粹pdf

    3. **原型与继承**:JavaScript的面向对象特性体现在其独特的原型链机制,通过理解原型和原型链,可以掌握对象的继承与扩展。 4. **DOM操作**:JavaScript与HTML的交互主要通过DOM(文档对象模型),学习如何选择...

    JavaScript语言精粹.pdf.zip

    2. **对象与原型**:JavaScript中的对象是其特性的核心,涉及对象创建、属性访问、原型链、构造函数、实例化等概念。 3. **闭包**:理解闭包是进阶JavaScript的关键,它涉及到作用域、变量生命周期和函数作为值的...

    JavaScript语言精粹 中文高清PDF

    《JavaScript语言精粹》是一本深受开发者欢迎的权威书籍,旨在深入探讨JavaScript这门重要的编程语言,帮助初学者和有经验的程序员掌握其核心概念和最佳实践。这本书以中文高清PDF的形式提供,使得读者可以方便地...

    JavaScript语言精粹.修订版 Javascript:The Good Parts 中英 pdf

    2. **对象和原型**:JavaScript的对象是一种基于原型的模式,这意味着对象可以从其他对象继承属性和方法。书中详细解释了如何创建和操作对象,以及原型链的工作原理。 3. **函数作为一等公民**:在JavaScript中,...

    JavaScript语言精粹 修订版 中文高清PDF

    《JavaScript语言精粹 修订版》是一本深受前端开发者喜爱的经典教材,专注于讲解JavaScript的核心概念和最佳实践。这本书深入浅出地介绍了JavaScript的精髓,帮助读者掌握这门强大的脚本语言,尤其对于前端开发人员...

    JavaScript语言精粹(修订版)

    此外,JavaScript的对象和原型机制是其独特之处,理解原型链、构造函数以及继承方式(如原型继承、组合继承、寄生组合继承、ES6的类继承)对于深入JavaScript至关重要。书中的修订版可能会涵盖最新的ES6及其后续版本...

    JavaScript语言精粹_修订版.pdf

    JavaScript语言精粹_修订版.pdf

    javascript语言精粹_修订版带书签.pdf

    3. **对象与原型**:JavaScript使用原型链实现继承,理解对象和原型的关系对于深入学习面向对象编程至关重要。 4. **异步编程**:事件循环、回调函数、Promise、async/await,这些都是JavaScript处理非阻塞I/O的...

    JavaScript语言精粹_修订版【高清】带书签 PDF

    还有原型和原型链,这是JavaScript实现继承的主要方式,理解它们对于深入学习对象导向编程至关重要。 此外,JavaScript的异步编程是其独特之处,通过回调函数、Promise和async/await等机制处理非阻塞操作,使得网页...

    JavaScript语言精粹(修订版)_itjsveryclever_JavaScript语言精粹(修订版)_

    《JavaScript语言精粹(修订版)》是JavaScript编程领域的一部经典著作,由知名的JavaScript专家Douglas Crockford撰写。这本书深入浅出地探讨了JavaScript的核心特性,旨在帮助读者掌握这门语言的精髓,提高编程...

    JavaScript 语言精粹(修订版,文字版+扫描版)

    本书通过对JavaScript语言的分析,甄别出好的和坏的特性,从而提取出相对这门语言的整体而言具有更好的可靠性、可读性和可维护性的JavaScript的子集,以便你能用它创建真正可扩展的和高效的代码。 雅虎资深...

    JavaScript语言精粹 修订版 pdf

    JavaScript语言精粹修订版pdf是许多朋友都在寻找的一款学习资料,在这里能够为您详细的介绍JS这门计算机语言,作者从语法、对象、函数、继承、数组、正则表达式、方法、样式和优美的特性这9 个方面来呈现这门语言...

    javascript语言精粹(中+英文版)

    原型和继承是JavaScript实现面向对象编程的关键特性,它们允许对象之间共享属性和方法。 书中还会深入探讨作用域和闭包,这是理解JavaScript内存管理的关键。作用域决定了变量的可见性和生命周期,而闭包则允许函数...

Global site tag (gtag.js) - Google Analytics