关于JavaScript面向对象的编程以下是我的理解,有不对的地方请指出;
JavaScript是一种基于对象的语言,遇到的东西几乎都是对象,但又不是完整的面向对象的语言,因为他的语法中没有类(class) ,使用中我们可以吧属性和方法封装成一个对象,有时候也会从原型对象中生成一个实例对象。我们可以通过下面代码实现:
我们先把猫看作一个对象,它有两个属性 : 颜色和名字 var cat ={ name :"", color: "" } 我们可以根据这个原型对象生成两个实例对象 var cat1 = {}; // 创建一个空对象 cat1.name = "大毛"; // 按照原型对象的属性赋值 cat1.color = "黄色"; var cat2 = {}; cat2.name = "二毛"; cat2.color = "黑色"; 这就是简单的封装了,把两个属性封装在一个对象里面。但是,这样的写法有两个缺点,一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有任何办法,可以看出有什么联系。
我们还可以用构造函数的模式,构造函数其实就是一个普通函数,但是在它内部使用了this变量,我们再用new对函数进行实例化,this变量也会绑定在实例对象上。
function Cat(name,color){ this.name=name; this.color=color; } 我们可以用new运算符生成实例对象 var cat1 = new Cat("大毛","黄色"); var cat2 = new Cat("二毛","黑色"); alert(cat1.name); // 大毛 alert(cat1.color); // 黄色
cat1和cat2 会自动含有constructor指向他们的构造函数
alert(cat1.constructor == Cat); //true alert(cat2.constructor == Cat); //true
我们还可以为cat添加不变的属性,比如type或者添加一个eat()方法,在这我们用一种节省内存的方法 来做,将不变的属性和方法直接定义到prototype对象上。
function Cat(name,color){ this.name = name; this.color = color; } Cat.prototype.type = "猫科动物"; Cat.prototype.eat = function(){alert("吃老鼠")}; 然后我们可以生成实例 var cat1 = new Cat("大毛","黄色"); var cat2 = new Cat("二毛","黑色"); alert(cat1.type); // 猫科动物 cat1.eat(); // 吃老鼠
对于构造函数的继承我们说两种方法,一个是 prototype模式,一个是直接继承prototype对第一种的改进
有一个动物的构造函数 function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数。 function Cat(name,color){ this.name = name; this.color = color; }
现在用第一种方法继承
Cat.prototype = new Animal(); Cat.prototype.constructor = Cat; var cat1 = new Cat("大毛","黄色"); alert(cat1.species); // 动物
Cat.prototype = new Animal();
代码的第一行,我们将Cat的prototype对象指向一个Animal的实例。
相当于完全删除了prototype 对象原先的值,然后赋予一个新值。
Cat.prototype.constructor = Cat;
第二行的意思是任何一个prototype对象都有一个constructor属性,指向它的构造函数。如果没有"Cat.prototype = new Animal();"这一行,Cat.prototype.constructor是指向Cat的;加了这一行以后,Cat.prototype.constructor指向Animal。
验证一下 alert(Cat.prototype.constructor == Animal); //true
每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性
alert(cat1.constructor == Cat.prototype.constructor); // true
因此,在运行"Cat.prototype = new Animal();"这一行之后,cat1.constructor也指向Animal!所以我们要注意使用第二行,改constructor的值
还有一种就是 直接继承prototype,这是对上一种方法的改进,由于Animal对象中,不变的属性都可以直接写入Animal.prototype。所以,我们也可以让Cat()跳过 Animal(),直接继承Animal.prototype。
我们先将Animal对象改写
function Animal(){ } Animal.prototype.species = "动物";
将Cat的prototype对象,然后指向Animal的prototype对象,这样就完成了继承。
Cat.prototype = Animal.prototype; Cat.prototype.constructor = Cat; var cat1 = new Cat("大毛","黄色"); alert(cat1.species); // 动物
但是我们要注意的是第二行实际上把Animal.prototype对象的constructor属性也改掉了
alert(Animal.prototype.constructor); // Cat
相关推荐
在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...
JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库
### JavaScript面向对象编程详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发领域占据着举足轻重的地位。尽管JavaScript本质上是一种基于原型的语言,但它也支持面向对象编程的一些特性,使得...
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。
总而言之,学习现代JavaScript面向对象编程,有助于开发者在认识这门语言演化的基础上,运用面向对象的设计和编程模式来构建更加健壮和可维护的JavaScript应用程序。同时,测试和调试是保证代码质量不可或缺的环节,...
下面将详细探讨JavaScript面向对象编程的基本原理、特性以及实际应用。 1. **类与对象** - 在JavaScript中,对象是键值对的集合,可以通过字面量语法或构造函数创建。例如: ```javascript const person = { ...
JavaScript面向对象编程指南是完整的扫描版...
javascript面向对象编程指南 2nd英文版,英文名:Object-Oriented JavaScript。 What you will learn from this book The basics of object-oriented programming, and how to apply it in the JavaScript ...
JavaScript面向对象编程.pdf
### JavaScript面向对象编程详解 #### 一、JavaScript面向对象编程简介 JavaScript作为一种广泛使用的脚本语言,虽然起源于一种简单的浏览器脚本环境,但随着时间的发展,它已经演变为一种功能强大的编程语言,...
JavaScript 面向对象 编程指南 完整扫描版
JavaScript面向对象编程指南完整版是扫描的....
资源名称:Javascript面向对象编程 内容简介: 从语言的视角来看,面向对象的程序设计和面向对象的Javascript 语言绝对不是什么摩登的 东西;Javascript 最开始就是被设计成一...