简单理解JavaScript中的封装与继承特性
JavaScript中的封装与继承特性
封装是面向对象编程中的一个基本特性,它允许我们隐藏对象的细节和数据,只让外界访问对象的公有变量和函数。在JavaScript中,我们可以通过不同的方式实现封装。
我们来看最简单的“门户大开型”方式。这种方式下,对象的所有方法和变量都是公有的,外界可以直接访问。例如,一个简单的Book对象,可以直接访问其name属性和getName方法。这种方式是最基础的创建对象的方法,但它没有隐藏任何细节和数据。
为了改进这个问题,我们可以尝试使用命名规范来区分私有变量。例如,我们可以使用下划线“_”来标识私有变量或方法。这种方式并不能真正地隐藏变量,因为如果有程序员故意使用_getName()这样的方法来调用方法,还是无法阻止的。
真正的封装需要通过闭包来实现。利用JavaScript中只有函数具有作用域的特性,我们可以在构造函数的作用域中定义相关变量。这些变量可以被定义域该作用域中的所有函数访问,但外界无法直接访问。例如,在Book2对象中,我们无法直接访问name变量,只能通过getName方法间接访问。这种方式解决了前两种方式的问题,但也有一定的弊端。由于每次创建新的对象实例时,都会为每个私有变量和方法创建一个新的副本,所以会耗费更多的内存。
至于继承,它是基于封装的一个特性,允许我们创建一个对象从另一个对象继承属性和方法。在JavaScript中,我们可以通过原型链来实现继承。子对象可以继承父对象的属性和方法,并且可以添加自己的属性和方法。这使得代码更加模块化,提高了代码复用性。
封装和继承是JavaScript中非常重要的两个特性。它们使得我们可以创建可复用的对象,并隐藏对象的内部细节和数据。通过理解这些特性并合理地使用它们,我们可以编写出更加高效、更加清晰的代码。以上就是关于JavaScript中的封装与继承特性的介绍,希望能对大家有所帮助。JavaScript中的继承艺术:从Book基类到ArtBook子类
曾经有一个神秘的时期,被称为“寒武纪爆发”,生命在地球上突然涌现,繁衍生息。就如同这个时代的书籍,不断地繁衍出新的类型。让我们以一个简单的Book基类开始,讲述这场“书籍的寒武纪爆发”。
我们有一个Book基类,它像是一个严格的导师,对每一本书的名字进行严格把关。如果一个书没有名字,它会抛出一个错误。它还有获取书名的功能。
Book类的代码大致如下:
```javascript
var Book = function(name){
if(!this.check(name)){
console.log("error");
throw new Error("name null");
}
this.name = name;
}
Book.prototype = {
check: function(name){
if(!name){
return true;
}
},
getName: function(){
return this.name;
}
}
```
然后,我们有了继承方法,这是一个神奇的桥梁,让我们的子类可以继承父类的特性。这里使用了一个空函数F作为中介,避免了直接实例化父类时可能带来的额外开销。这个方法允许我们在子类中轻松调用父类的构造函数和继承父类的方法。这个继承方法的代码是这样的:
然后,我们有了ArtBook子类,它是Book基类的继承者,除了拥有基类的所有特性外,还有自己的独特之处,比如价格。在ArtBook中,我们可以调用父类的getName方法,并在其后添加"!!!",以表示这是艺术书籍的特殊性质。ArtBook也有获取价格的方法。这就是ArtBook类的代码:
```javascript
var ArtBook = function(name,price){
ArtBook.superClass.Constructor.call(this,name);
this.price = price;
}
extend(ArtBook,Book);
ArtBook.prototype.getPrice = function(){
return this.price;
}
ArtBook.prototype.getName = function(){
return ArtBook.superClass.getName.call(this)+"!!!";
}
```
我们调用`cambrian.render('body')`来渲染这个“书籍的寒武纪爆发”。此刻,我们仿佛置身于那个生机勃勃的时代,看着各种类型的书籍如同生命一般涌现出来。书籍的每一页都承载着知识、情感和智慧,就像生命在地球上的每一次繁衍生息都承载着希望和梦想。书籍和生命一样,都在不断地进化、发展,为我们带来更多的惊喜和启示。
编程语言
- 简单理解JavaScript中的封装与继承特性
- AngularJS的Filter的示例详解
- vue观察模式浅析
- angularJS之$http:与服务器交互示例
- .Net Core 之 Ubuntu 14.04 部署过程(图文详解)
- PHP正则表达式的效率 回溯与固化分组
- 从性能方面考虑PHP下载远程文件的3种方法
- PHP中require和include路径问题详解
- PHP利用正则表达式将相对路径转成绝对路径的方
- 浅析.Net Core中Json配置的自动更新
- Javascript基础教程之argument 详解
- 详解开发react应用最好用的脚手架 create-react-app
- JavaScript中的数据类型转换方法小结
- LiteralControl ASP.NET中的另类控件
- 批量替换sqlserver数据库挂马字段并防范sql注入攻
- JavaScript中的普通函数与构造函数比较