Javascript创建类和对象详解
JavaScript中的类与对象创建方法
JavaScript是一种多范式编程语言,支持面向对象编程。让我们来几种创建类和对象的方法。
一、原始的创建方法
在JavaScript中,最初创建对象的方式是通过new关键字和Object构造函数。这种方式虽然简单,但对于复杂对象的创建,属性和方法的封装不够紧密,对于熟悉Java等强类型面向对象语言的人来说,可能会觉得不够直观。
例如:
```javascript
var person = new Object();
person.name = "Amy";
person.sex = "Woman";
person.show = function() {
document.write("Name is: " + this.name + "; Sex is:" + this.sex);
}
person.show();
```
二、工厂方法模式
工厂方法模式是对原始创建方法的一种改进,它将对象的创建封装在一个函数中。工厂函数可以接受参数,根据参数返回不同的对象实例。这种模式更像一个类,可以复用代码和封装逻辑。但是每次创建新对象时,都会为对象的方法创建新的函数实例,造成不必要的资源浪费。
例如:
```javascript
function personFactory(name, age, sex) {
var ob = new Object();
ob.name = name;
ob.age = age;
ob.sex = sex;
ob.show = function() { // 每次都会创建一个新的show函数实例
document.write(ob.name + " " + ob.age + " " + ob.sex);
}
return ob;
}
var person = personFactory("Amy", 21, "Woman");
person.show();
``` 改进后,将show函数提取出来:
```javascript
function show() { // 将show函数放在工厂外部实现复用
document.write(this.name + " " + this.age + " " + this.sex);
}
function personFactory(name, age, sex){
var ob = new Object();
JavaScript中的构造方法模式与动态原型方法
在JavaScript中,我们常通过构造方法来创建对象,并为其封装属性和方法。这个过程与Java创建类和对象的过程颇为相似。当我们调用对象的方法时,是否每次都需要为每一个对象创建独立的方法呢?答案是否定的。我们可以创建一个类的方法,让所有对象共享这个方法,就像Java中的static方法一样。接下来,我们将如何通过动态原型方法来实现这一目标。
让我们回顾一下构造方法模式。在JavaScript中,我们可以使用函数来模拟类的构造方法,为对象封装属性和方法。例如:
```javascript
function person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.show = function() {
document.write(this.name + " " + this.age + " " + this.sex);
document.write("
");
}
}
var per = new person("Amy", 22, "Woman");
per.show();
```
在上述代码中,我们创建了一个名为person的函数,并使用new关键字创建了一个对象per。每个对象都有自己的show方法。这种方法在每次创建对象时都会生成一个新的show方法,造成了不必要的浪费。那么,如何创建一个所有对象共享的方法呢?答案是使用动态原型方法。
动态原型方法允许我们为所有对象创建一个类方法,该方法可以被所有对象共享。这类似于Java中的static方法。我们可以修改上述代码,以实现这个目标:
```javascript
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
if (typeof Person.tag == "undefined") { // 仅当第一个对象创建时执行此块代码
Person.prototype.show = function() { // 创建属于类Person的show方法
document.write(this.name + " " + this.age + " " + this.sex);
document.write("
");
}
Person.tag = true; // 设置标志位,避免重复创建show方法
}
}
var per = new Person("Peter", 22, "Man");
per.show(); // 所有通过Person创建的实例都可以调用show方法
```
在上述代码中,我们使用了动态原型方法来创建一个属于整个类的show方法。这意味着所有通过Person创建的实例都可以调用这个方法,而无需为每个实例都创建自己的show方法。这种方式不仅节省了内存,还提高了执行效率。需要注意的是,以“类名.prototype.属性/方法”方式创建的属性和方法是属于整个类的,而非单个对象,也即所有对象是共享的。在学习JavaScript类和对象的过程中,这种技巧是非常有用的。以上内容仅为个人理解,如有错误之处,还请大家批评指正。至此我们的学习之旅尚未结束,下一章节我们将继续深入JavaScript的奥秘。让我们共同期待!