最近在读javascript高级程序设计,其中的对象基础一章感觉讲的很好,下面把其中有用的东西分享一下。
看如下js构造类的一个示例:
function Car(sColor, iDoors, iMpg) {
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.showColor = function() {
alert(this.color);
}
}
var oCar1 = new Car('red', 4, 23);
var oCar2 = new Car('blue', 3, 25);
这种方法被称为构造函数方式
。简要的说明一下,这段代码声明了一个Car类,oCar1和oCar2为其两个对象。看起来这段代码很是不错,但是注意那个this.showColor = function(){alert(this.color)};
this指代Car的一个对象,也就是说,每一个对象都有一个showColor方法,这势必会造成一种资源浪费。
再来看一种js构造类的示例:
function Car(){
}
Car.prototype.color = "red";
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.showColor = function(){
alert(this.color);
}
var oCar1 = new Car();
var oCar2 = new Car();
这种方法被称为原型方式
。该方法避免了showColor函数被每个对象都创建,而是所有Car类的对象共享这一个函数,然后在调用的时候,使用this关键字找到实例对象的color,这种方式也有问题,即color,doors和mpg被所有对象共享,如果一个对象修改了color那么其他的对象的color也会相应的改变。
那么显然将二者结合起来就好了:
function Car(){
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
}
Car.prototype.showColor = function(){
alert(this.color);
}
var oCar1 = new Car();
var oCar2 = new Car();
这种方式被称为混合的构造函数/原型方法
。
这个代码就没有什么问题了,那么动态原型方法
指的是什么呢?
我们先来看一段java代码:
class Car {
public String color = "red";
public int doors = 4;
public int mpg = 23;
public Car(String color, int doors, int mpg){
this.color = color;
this.doors = doors;
this.mpg = mpg;
}
public void showColor() {
System.out.println(this.color);
}
}
这是和我们前面js构造出来的相似的一个java class.由此可见由于java超强的面向对象的机制,已经把这种属性和方法的区别为我们做好了,我们只需要将所有的方法写在class中,然后java处理好剩下的事情。
js也有一种几乎完全和这段java类似的方法-动态原型方法
function Car(sColor,iDoors,iMpg){
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
if(typeof Car._initialized == "undefined"){
Car.prototype.showColor = function(){
alert(this.color);
}
Car._initialized = true.
}
}
这回看起来舒服多了吧,不过动态原型方法
在继承的时候有一个问题:
function Polygon(iSides) {
this.sides = iSides;
if(typeof Polygon._initialized == "undefined"){
Polygon.prototype.getArea = function(){
return 0;
}
Polygon._initialized = true;
}
}
function Triangle(iBase,iHeight){
Polygon.call(this,3);
this.base = iBase;
this.height = iHeight;
if(typeof Triangle._initialized == "undefined"){
Triangle.prototype = new Polygon();
Triangle.prototype.getArea = function(){
return .5 * this.base * this.height;
}
Triangle._initialized = true;
}
}
var tri1 = new Triangle(3,4);
alert(tri1.getArea());
这段代码根本就跑不起来,也就是说当
var tri1 = new Triangle(3,4);
执行的时候,程序会进入Triangle的构造函数中,然后依次执行,此时Triangle的这个对象已经被实例化了,所以当再次调用
Triangle.prototype = new Polygon();
自然就会报错了。也就是说,动态原型方法
不适合与继承中子类的构造。
那么修改一下就可以了:
function Polygon(iSides) {
this.sides = iSides;
this.type = "Polygon";
if(typeof Polygon._initialized == "undefined"){
Polygon.prototype.getArea = function(){
return 0;
}
Polygon._initialized = true;
}
}
function Triangle(iBase,iHeight){
Polygon.call(this,3);
this.base = iBase;
this.height = iHeight;
if(typeof Triangle._initialized == "undefined"){
Triangle.prototype.getArea = function(){
return .5 * this.base * this.height;
}
Triangle._initialized = true;
}
}
Triangle.prototype = new Polygon();
var tri1 = new Triangle(3,4);
alert(tri1.getArea());
alert(tri1.type);
总之,js面向对象是js重要的一关,也是js高级的重要部分,所以语法特性不是一个语言最重要的部分,而模式,设计,OO这些东西才是学好一门语言的关键。可以看看ext的东西,尤其是源代码(我目前是没看懂),你就会发现,ext使用类似swing的模式,使用js这种语言搭建了一个如此庞大的对象的库是多么的强大了。
分享到:
相关推荐
在JavaScript面向对象的上下文中,我们可以创建专门处理Canvas绘图的类,封装复杂的绘图逻辑: ```javascript class Circle { constructor(x, y, radius) { this.x = x; this.y = y; this.radius = radius; } ...
在深入讲解JavaScript面向对象与原型的知识点之前,首先需要了解JavaScript的基础知识。在JavaScript中,面向对象编程(OOP)的概念虽然存在,但是它的实现与传统基于类的语言有所不同。ECMAScript,也就是...
以下是对JavaScript面向对象和原型机制的详细解释: 1. 面向对象的基本概念: - 类:在许多面向对象语言中,类是创建对象的模板,但在JavaScript中没有类的概念。 - 对象:JavaScript中的对象是一组键值对,可以...
JavaScript面向对象是编程语言JavaScript中的核心概念之一,它在实际开发中扮演着至关重要的角色。JavaScript,虽然最初设计为一种轻量级的脚本语言,但随着其发展,逐渐引入了面向对象的特性,使得它能够支持更复杂...
在提供的资源中,《代码之美》PDF文件可能包含了关于编程实践和代码风格的指导,而《Javascript面向对象编程》PPT可能更具体地阐述了JavaScript OOP的细节和示例。学习这些材料将有助于深入理解JavaScript的面向对象...
在本文中,我们将介绍JavaScript面向对象编程中的经典案例,包括对象、类、继承、原型链和闭包等概念。 一、对象和类 在JavaScript中,对象是指一个实体,可以拥有自己的属性和方法。对象可以使用工厂函数或构造...
### 面向对象JavaScript精要 #### 一、书籍概览 本书《面向对象JavaScript精要》由Nicholas C. Zakas编写,是面向对象编程领域中的权威指南之一,尤其针对JavaScript这门语言。作者深入浅出地介绍了面向对象编程的...
标题 "猜拳游戏:java面向对象,kotlin面向对象,js面向对象,3个方法开发.zip" 提供了关于一个编程项目的概览,这个项目采用了三种不同的编程语言——Java、Kotlin和JavaScript,来实现同一个猜拳游戏。面向对象...
下面将详细探讨JavaScript面向对象编程的基本原理、特性以及实际应用。 1. **类与对象** - 在JavaScript中,对象是键值对的集合,可以通过字面量语法或构造函数创建。例如: ```javascript const person = { ...
JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库
《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码...
综上所述,"JS弹性导航条---面向对象"是一个关于如何利用JavaScript的面向对象特性来创建一个灵活、可扩展的导航条组件的实践。通过构造函数、原型方法和事件处理,我们可以创建一个不仅能满足基本导航功能,还能...
在这个"02-js面向对象考核-tab栏案例"中,我们可以深入探讨JavaScript面向对象编程在实际项目中的应用,尤其是如何使用它来实现tab栏切换功能。 首先,让我们理解面向对象的基本概念。在JavaScript中,对象是键值对...
JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。
JavaScript是一种广泛应用于Web开发的动态编程语言,尤其以其强大的面向对象特性而闻名。面向对象编程(Object-Oriented ...通过阅读`prototype.js`这样的示例代码,可以帮助加深对JavaScript面向对象编程的理解。
第16周-第16章节-Python3.5-JavaScript面向对象及原型.avi
### JavaScript面向对象编程精要 #### 一、引言 JavaScript是一种灵活且强大的脚本语言,它虽然起源于一种简单的浏览器脚本语言,但随着时间的发展,JavaScript已经成为了一种功能全面的编程语言,尤其是在Web开发...