本文基于《JavaScript高级程序设计》解析面向对象核心概念。首先介绍工厂模式解决重复实例化但无法识别对象类型的问题,随后深入讲解构造函数模式。通过对比两者在对象创建、this指向、返回值及new运算符使用上的差异,阐明构造函数如何解决对象识别问题,并结合代码示例说明实例化与类型判断。
JavaScript面向对象概述
本文核心内容参考自《JavaScript高级程序设计》中关于面向对象与原型的章节。
工厂模式及其局限性
1、工厂模式
在ECMAScript中,可以利用工厂模式来创建对象。
//工厂模式
function createObject(name, age) {
var obj = new Object(); //创建对象
obj.name = name; //添加属性
obj.age = age;
obj.run = function () { //添加方法
return this.name + this.age + '运行中...';
};
return obj; //返回对象引用
};
var obj1 = createObject('Lee', 100); //创建第一个对象
var obj2 = createObject('Jack', 200); //创建第二个对象
//alert(obj1.run()); //打印第一个对象实例的run()方法
//alert(obj2.run()); //打印第二个对象实例的run()方法
//alert(typeof obj1);
//alert(typeof obj2);
alert(obj1 instanceof Object); //true
alert(obj2 instanceof Object); //true
虽然工厂模式解决了重复实例化对象的问题,但它无法解决对象识别问题,因为所有通过该模式创建的对象类型均被识别为Object。为了解决对象识别问题,我们需要采用下文介绍的构造函数方式。
构造函数模式详解
2、构造函数
//构造函数创建
function Person(name,age){ //所有构造函数对象都是Object
this.name=name;
this.age=age;
this.run=function(){
return this.name+this.age+"ing...";
};
};
var person1=new Person('zhu1',100);
var person2=new Person('zhu2',200);
alert(person1.run());
alert(person2.run());
alert(person1 instanceof Object); //ture
alert(typeof person2); //Person
alert(person2 instanceof Person); // true
var person3=new Object();
Person.call(person3,'zhu3',300);//对象冒充,person3是Object类型,冒充Person类型
alert(person3.run());
在构造函数中,this关键字代表当前作用域内对象的引用。若在全局范围内使用,this指向window对象;若在构造函数体内使用,则指向当前构造函数所声明的新对象。
构造函数方法不仅解决了重复实例化的问题,还解决了对象识别问题。与工厂模式相比,两者的主要区别如下:
1. 构造函数没有显式地创建对象(即不使用new Object());
2. 直接将属性和方法的值赋值给this;
3. 没有return语句;
4. 使用构造函数创建对象时,必须使用new运算符。
以上即为本文关于JavaScript面向对象与原型的全部内容,希望对大家有所帮助。