首页 > 语言 > JavaScript > 正文

老生常谈javascript的面向对象思想

2024-05-06 15:12:34
字体:
来源:转载
供稿:网友

面向对象的三大基本特性

封装(把相关的信息(无论数据或方法)存储在对象中的能力)

继承(由另一个类(或多个类)得来类的属性和方法的能力)

多态(一个对象在不同情况下的多种形态)

定义类或对象

第一种:基于Object对象

var person = new Object();person.name = "Rose";person.age = 18;person.getName = function () { return this.name;};console.log(person.name);//Roseconsole.log(person.getName);//function () {return this.name;}console.log(person.getName());//Rose 

缺点:不能创建多个对象。

第二种:基于字面量方式

var person = { name : "Rose", age : 18 , getName : function () {  return this.name; }};console.log(person.name);//Roseconsole.log(person.getName);//function () {return this.name;}console.log(person.getName());//Rose

优点:比较清楚的查找对象包含的属性和方法;

缺点:不能创建多个对象。

第三种:工厂模式

方式一:

function createPerson(name,age) { var object = new Object(); object.name = name; object.age = age; object.getName = function () {  return this.name; }; return object;}var person1 = createPerson("Rose",18);var person2 = createPerson("Jack",20);console.log(person1.name);//Roseconsole.log(person2.name);//Jackconsole.log(person1.getName === person2.getName);//false//重复生成函数,为每个对象都创建独立的函数版本 

优点:可以创建多个对象;

缺点:重复生成函数getName(),为每个对象都创建独立的函数版本。

方式二:

function createPerson(name,age) { var object = new Object(); object.name = name; object.age = age; object.getName = getName; return object;}function getName() { return this.name;}var person1 = createPerson("Rose",18);var person2 = createPerson("Jack",20);console.log(person1.name);//Roseconsole.log(person2.name);//Jackconsole.log(person1.getName === person2.getName);//true//共享同一个函数

优点:可以创建多个对象;

缺点:从语义上讲,函数getName()不太像是Person对象的方法,辨识度不高。

第四种:构造函数方式

方式一:

function Person(name,age) { this.name = name; this.age = age; this.getName = function () {  return this.name; }}var person1 = new Person("Rose",18);var person2 = new Person("Jack",20);console.log(person1.name);//Roseconsole.log(person2.name);//Jackconsole.log(person1.getName === person2.getName); //false//重复生成函数,为每个对象都创建独立的函数版本

优点:可以创建多个对象;

缺点:重复生成函数getName(),为每个对象都创建独立的函数版本。

方式二:

function Person(name,age) { this.name = name; this.age = age; this.getName = getName ;}function getName() { return this.name;}var person1 = new Person("Rose",18);var person2 = new Person("Jack",20);console.log(person1.name);//Roseconsole.log(person2.name);//Jackconsole.log(person1.getName === person2.getName); //true//共享同一个函数             
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选