JS封装类或对象的最佳方案
面向对象强大的优点之一是能够创建自己专用的类或者对象,封装一组属性和行为。抛开性能来说,JS要比面向对象语言如JAVA要灵活好用的多,组装数据结构很灵活方便。那么我们如何来用面向对象的思维来定义JavaScript的类或对象呢?
问题的出现
如果要抽象出来一个人,那么简单的属性为:name,sex,birthday等,方法为:sayHi,最初级的写法就是
var oPerson = new Object;
oPerson.name = "zs";
oPerson.sex = 'boy';
oPerson.birthday = '2001-02-03';
oPerson.sayHi = function()
{
alert("Hi ! I am "+this.name);
}
那么我们要多创建几个人,怎么办呢?就得再写几个Object,那得哭死,那么怎么办呢?看下面的几种解决方案:
下面的最终解决方案可能不是最佳,但是我目前的水平,是觉得最佳的,欢迎指教
functon createPerson(name,sex,birthday)
{
var oPerson = new Object;
oPerson.name =name;
oPerson.sex = sex;
oPerson.birthday = birthday;
oPerson.sayHi = function()
{
alert("Hi ! I am "+this.name);
}
return oPerson;
}
//那么我们多创建几个人的话,就可以
var person1 = new createPerson('zs','boy','2001-02-03');
var person2 = new createPerson('ls','boy','2001-02-04');
person1.sayHi();
person2.sayHi();
看上去,似乎解决了,但是问题是 你创建几个人就创建了几个sayHi行为,但是他们都是一个功能,怎么办呢?JS的灵活造就了下面的解决方法,把方法作为一个对象的属性:
function sayHi()
{
alert("Hi ! I am "+this.name);
}
functon createPerson(name,sex,birthday,fn)
{
var oPerson = new Object;
oPerson.name =name;
oPerson.sex = sex;
oPerson.birthday = birthday;
oPerson.sayHi = sayHi;//这里是个函数引用
return oPersn;
}
var person1 = new createPerson('zs','boy','2001-02-03');
var person2 = new createPerson('ls','boy','2001-02-04');
person1.sayHi(); //outputs "Hi ! I am zs"
person2.sayHi(); //outputs "Hi ! I am ls"
问题似乎解决了,但是,你参见prototype就会发现人家有更高明的解决方案,所有函数只创建一次,而每个对象都具有自己的对象属性实例,看下面的代码:
最终方案
functon CreatePerson(name,sex,birthday,fn)
{
this.name =name;
this.sex = sex;
this.birthday = birthday;
}
CreatePerson.prototype.sayHi = function ()
{
alert("Hi ! I am "+this.name);
}
var person1 = new CreatePerson('zs','boy','2001-02-03');
var person2 = new CreatePerson('ls','boy','2001-02-04');
person1.sayHi(); //outputs "Hi ! I am zs"
person2.sayHi(); //outputs "Hi ! I am ls"
一般情况下,一个对象或者类不只一个方法,需要多个方法配合使用,那么
CreatePerson.prototype={
sayHi:function()
{
alert("Hi ! I am "+this.name);
},
walk:function()
{
alert("walk,walk");
},
……
}
是不是优雅的多?
昨天写了一半,看到同志们回复是javascript高级程序设计上的,我要说的是对,确实是来源于上面,我就不废话了,中间省掉了很多循序渐进的引导,如:工厂模式、构造函数方式、原型方式、混合的构造方法/原型方式、动态原型方式、混合工厂模式。希望想学好JS的同志们回头多看看这些,会明白很多“为什么”。
呵呵,炫丽背后其实很朴实。
分享到:
相关推荐
通过学习和运用这些经典的JavaScript封装技术,开发者不仅能提升代码质量,还能跟上技术发展趋势,确保项目在未来的可扩展性和兼容性。同时,理解并熟练掌握封装原则,也是成为一名优秀JavaScript开发者的重要一步。
- **类与对象**:JavaScript没有内置的类的概念,但在ES6中引入了`class`关键字来模拟类的行为。对象则是由类实例化出来的具体实体。 - **封装**:封装是指将数据和操作这些数据的方法绑定在一起,隐藏内部状态,只...
JavaScript提供了多种模块化方案,如CommonJS(Node.js)、AMD(RequireJS)和ES6的`import`/`export`。 7. **设计模式** - 在JavaScript OOP中,常见的设计模式有单例模式、工厂模式、观察者模式等。这些模式提供...
在JavaScript中,我们可以使用函数、对象、类等结构进行封装。模块化工具,如CommonJS(在Node.js中使用)和ES6的import/export,进一步促进了代码的组织和重用。 在实际项目中,我们经常需要借助第三方库和框架,...
JavaScript的构造函数是一种特殊的方法,用于创建和初始化对象。使用`new`关键字调用构造函数可以创建新对象。 ```javascript function Person(name, age) { this.name = name; this.age = age; } Person....
但是,构造函数模式也有一个重要的缺陷,那就是在构造函数中定义的方法会在每个对象实例中重复创建,这在一些性能要求较高的场景下可能不是最佳选择。 3. 原型模式 原型模式是另一种在JavaScript中实现对象创建的...
9. **面向对象最佳实践**:在JavaScript中进行面向对象编程时,需要注意一些最佳实践,例如避免全局变量,合理使用`this`关键字,理解闭包的影响,以及充分利用箭头函数和类的特性。 通过学习和掌握以上知识点,你...
Zakas撰写,全面介绍了JavaScript作为一种动态语言如何支持面向对象编程模式,并探讨了在实际开发中应用这些模式的最佳实践。 #### 二、面向对象编程基础 面向对象编程(OOP)是一种编程范式,其核心思想是将数据...
JavaScript的面向对象特性并不像Java或C++那样是原生的,而是通过构造函数和原型链来实现的。构造函数用于创建具有特定属性和方法的对象,而原型链则让对象能够共享属性和方法,实现继承。此外,ES6引入了类的概念,...
JavaScript虽然不像Java或C++那样具备传统的类和继承机制,但它仍然可以有效地支持面向对象编程。 - **JavaScript中的OOP特点**: - **基于原型**:JavaScript采用基于原型的继承模型,允许对象直接从其他对象继承...
封装是指将数据(属性)和对这些数据的操作(方法)包装在一起,形成一个整体,即对象或类。在面向对象编程中,封装是实现隐藏技术的一种手段,目的是为了增强安全性和简化使用方式。对于JavaScript而言,虽然它是...
- 避免使用`new`关键字,可以考虑使用工厂函数或类的静态方法创建对象。 - 使用`instanceof`检查对象的类型,避免使用`typeof`,因为JavaScript的类型系统是动态的。 - 尽可能利用原型链实现继承,而不是使用`...
### JavaScript面向对象编程详解 #### 一、现代JavaScript概述 随着技术的发展,JavaScript这门语言逐渐从最初的简单脚本语言成长为现在广泛应用于Web前端、后端甚至桌面应用的强大编程工具。现代JavaScript具备...
- **封装**:封装是OOP的核心原则之一,意味着将数据和操作这些数据的方法打包到一个单独的单元(类)中,以保护内部状态并提供接口给外部使用。对于弹出层,我们可以定义私有变量存储状态,公开方法来控制弹出层的...
1. 封装是指将数据(属性)和操作数据的方法(函数或方法)捆绑在一起,形成一个独立的单元——对象。封装可以隐藏对象的实现细节,只暴露必要的接口给外部调用。 2. 继承是指一种基于类的关系,它允许新创建的类...
在JavaScript中实现类的方式主要有几种,包括对象字面量(Object Literal)、构造函数(Constructor)、原型链(Prototype Chain)以及ES6引入的类语法。每种方式都有其适用的场景和特点,理解它们有助于我们更好地...
JavaScript 类的封装是面向对象编程中的一个重要概念,它允许我们将数据和操作这些数据的方法绑定在一起,从而保护数据不受外部的不适当访问。封装的主要目的是提高代码的可维护性、安全性和模块化。以下是对...
6. 对象:JavaScript的对象是属性和方法的集合,可以使用字面量语法或构造函数创建。理解原型链、继承和封装的概念,有助于构建复杂的对象系统。 7. 类与类式继承:ES6引入了class语法糖,提供了更接近传统面向对象...
面向对象编程的核心概念包括类、对象、继承和封装。尽管JavaScript没有传统意义上的“类”概念,但它提供了其他方式来实现这些功能。 **1.1 对象的创建** 在JavaScript中,对象可以通过字面量的方式创建: ```...