下面小编就为大家带来一篇对 Js OOP 编程 创建对象的一些全面理解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
对象的含义
对象可以是汽车,人,动物,文字,表单或者任何存在的事物等等。
对象有:
属性 ------- 对象的某些特定的性质。
方法 ------- 对象能做的事情。
事件 ------- 能响应发生在对象上的事情。
我们可以通过创建一个人的对象来理解面向对象
人:
两只手,两只脚,一个头,还可以跑动。
手,脚,头,是人的属性,跑动是人的方法。
首先,我们来用最简单的方法创建一个对象
- var person = {
- head: "one",
- hand: "two",
- foot: "two",
- run : function(){
- console.log("running");
- }
- }
这个方法一点都不实用,因为它是创建一个单独的对象,, 而这个对象和任何常见的数据结构没有任何联系。
然后,我们用构造函数的方式创建一个对象
- var Person = function() { //注意,首字母大写
- this.head = "one",
- this.hand = "two",
- this.foot = "two",
- this.run = function() {
- alert("running");
- }
- }
- var Joan = new Person();
- document.write(Joan.run()) // "running"
这是用构造函数创建的对象,然后我们再加上一行代码看看
- var Niki = new Person();
- alert(Joan == Niki) //false;
是的,现在创建了是两个不同的对象实例。
在 JavaScript 中的每个函数都有一个 prototype 的属性. 如果某个函数被用作构造函数, 则这个属性会被自动通过 new 调用创建对象的原型
- console.log(Joan)
可以看到有一个__proto__:Person, 其中__proto__是 Joan 的原型链. 它是指向 Person 的原型.
JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象 prototype。
关于原型链的一些理解, 在 JavaScript 高级程序设计 一书中写的非常详细。有兴趣的可以去看看,网上也有 pdf 的文档可以找到。不过建议还是买本书,支持原版嘛。
然后对 prototype 这个原型属性的任何更改能够应用于用 new Person() 构造的每一个实例对象, 不管它是在更改之前还是更改后创建. 为 Person.prototype 添加新函数. 具体如下:
- var Person = function() { //注意,首字母大写
- this.head = "one",
- this.hand = "two",
- this.foot = "two"
- }
- Person.prototype.run = function() {
- alert("running");
- }
- var Joan = new Person();
- Joan.run() // "running"
- alert(Joan.__proto__ === Person.prototype) //'true'
可以看到,在原型中创建方法是可以调用的,同时 Joan 的原型链是指向 Person 的原型的。
再看:
- var Niki = new Person(); //"runing"
- Person.prototype.run = function() {
- alert("running running")
- }
- Joan.run() //"running running"
- Niki.run() //"running running"
看,修改 Person 的原型方法,所有被 new Person() 创建的对象实例中的方法都被修改了,因为所有实例中共用的是同一个原型方法 run。这就是原型的一种应用。
这就是关于创建对象的一些理解。
写了好久。也不知道有没有错误。 如果有错误,欢迎各位大大指点。
下次再写面向对象继承方面的东西。
来源: http://www.phperz.com/article/17/0320/264105.html