JavaScript面向对象编程:类与实例详解
164 浏览量
更新于2024-08-30
收藏 108KB PDF 举报
"本文深入讲解了JavaScript中的面向对象程序设计,包括类的创建、实例对象、构造函数以及原型等核心概念。通过实例演示了如何使用工厂模式和构造函数式来创建对象,并介绍了对象的一些基本属性和方法,如Constructor、hasOwnProperty、isPrototypeOf以及propertyIsEnumerable等。"
JavaScript是一种支持面向对象编程的动态类型语言,它提供了多种实现面向对象的方式。在JavaScript中,面向对象主要基于以下三种模式:函数、原型和类(ES6引入)。
1. **工厂模式创建对象**:
工厂模式是创建对象的一种方式,如示例中的`CreatePerson`函数。这个函数通过创建一个新的`Object`,然后给它添加属性和方法,最后返回这个对象。这样可以创建具有相同结构的不同对象,例如`p1`。
```javascript
function CreatePerson(name, sex, age) {
var obj = new Object();
obj.name = name;
obj.sex = sex;
obj.age = age;
obj.sayName = function() {
console.log(this.name);
}
return obj;
}
var p1 = CreatePerson('zf', '女', 22);
p1.sayName(); // 输出 "zf"
```
2. **构造函数式创建对象**:
构造函数是一种特殊类型的函数,通常用于初始化新创建的对象。当使用`new`关键字调用构造函数时,会创建一个新的对象,并将其`this`上下文指向这个新对象。在示例中,`Person`就是构造函数,它定义了`name`、`age`和`sex`属性以及`sayName`方法。
```javascript
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.sayName = function() {
alert(this.name);
}
}
var p1 = new Person('zf', 20, '女');
p1.sayName(); // 弹出对话框显示 "zf"
```
3. **实例对象与构造函数**:
使用`new`关键字调用构造函数创建的是实例对象,如`p1`。构造函数内部的`this`关键字引用的是新创建的对象。实例对象可以通过`constructor`属性访问其构造函数。
4. **原型**:
JavaScript中的对象都有一个内部属性`[[Prototype]]`,通常通过`__proto__`或`Object.getPrototypeOf()`访问。对象可以通过原型链共享属性和方法。当试图访问实例对象的某个属性时,如果该对象本身没有该属性,JavaScript会查找其原型,如果原型也没有,会继续查找原型的原型,直到找到该属性或者查找到原型链的末端。
5. **实例方法与原型方法**:
在构造函数中定义的方法(如`sayName`)是实例方法,每个实例对象都拥有自己的副本。而如果希望所有实例共享同一个方法,可以将方法定义在构造函数的`prototype`上,这样所有实例都可以访问。
```javascript
Person.prototype.sayHello = function() {
alert('Hello, ' + this.name);
}
p1.sayHello(); // 弹出对话框显示 "Hello, zf"
```
6. **对象的内置方法**:
- `hasOwnProperty(propertyName)`:判断对象自身属性是否存在,不检查原型链。
- `isPrototypeOf(object)`:判断传入的对象是否是当前对象的原型。
- `propertyIsEnumerable(propertyName)`:检查指定的属性是否可枚举,即是否可以通过`for...in`循环遍历。
这些是JavaScript面向对象编程的基础,理解它们对于编写复杂的JavaScript代码至关重要。通过灵活运用这些概念,可以创建出高效、可维护的代码结构。
145 浏览量
点击了解资源详情
1190 浏览量
119 浏览量
点击了解资源详情
108 浏览量
111 浏览量
点击了解资源详情
110 浏览量
weixin_38628362
- 粉丝: 6
- 资源: 897
最新资源
- talks:我讲过的各种演讲的幻灯片和资料
- ColorRampGenerator:色带生成器
- 具有dnssec支持的重要隐私,快速递归的dns解析器服务器-Golang开发
- ASP人才网内容管理系统(源代码+论文).zip
- 梅吉特
- Google浏览器安装包
- favicon-badge:一个Polymer元素,用于使用动态设置的数字声明式更新Webapp的favicon。
- react-way-immutable-flux:使用ES6,Immutable.js和Flux的React.js方法
- Trubble
- testina
- uskzvqgn.zip_相位跟踪
- my-plugin-manager:用于WordPress主题或插件的嵌入式脚本,为您的用户提供一个界面,以管理您建议与产品一起使用的插件
- 用数组实现一个线性表.zip
- Gx00_83-05-33-SNMP.zip
- imersaodev-conversoranosluz:每天从法拉利岛(Códigofeitotambémna1ª)出发。 Us programa em que quee convert anos luz emquilômetrose assim poder saber adistânciade planetas e astros
- [Android实例] Android 竖着的SeekBar.rar