回归前端学习第二天

简单理解javascript面向对象原理

从零开始面向对象的程序设计

1.简单描述OOP:
OOP(Object-oriented programming ,OOP) 的基本思想是:在程序里,我们通过使用对象去构建现实世界的模型,把原本很难(或不可)能被使用的功能,简单化并提供出来,以供访问。
2.对象理解:
对象可以包含相关的数据和代码,这些数据和代码用于表示 你所建造的模型是什么样子,以及拥有什么样的行为或功能。对象包(object package,或者叫命名空间 namespace)存储(官方用语:封装)着对象的数据(常常还包括函数),使数据的组织和访问变得更容易了;对象也常用作 数据存储体(data stores),用于在网络上运输数据,十分便捷。

理论理解:定义一个对象模板

考虑一个简单的程序,显示学校的学生和老师的信息,讨论OOP思想。

1.定义好Person对象的属性和方法(包括他们的名字,年龄,性别,兴趣 这些信息,然后,我们会基于他们的这些信息写一个简短的介绍关于他们自己,在最后我们还需要教会他们打招呼)

以上方式被称为抽象-为了编程的目标而利用事物的一些重要特性去把复杂的事物简单化

2.创建一个真正的对象
基于我们的Person类,我们可以创建出许许多多的真实的人。

首先,定义好Person对象的属性和方法
当一个对象需要从类中创建出来时,类的构造函数就会运行来创建这个实例。这种创建对象的过程我们称之为实例化-实例对象被类实例化。
当一个对象需要从类中创建出来时,类的构造函数就会运行来创建这个实例。这种创建对象的过程我们称之为实例化-实例对象被类实例化。

3.具体的对象

将Person定义为类型更具体的人,如老师、学生。

在 OOP 里,我们可以创建基于其它类的新类,这些新的子类可以继承它们父类的数据和功能。比起复制来说这样能够使用父对象共有的功能。如果类之间的功能不同,你可以根据需要定义专用的特征。


老师和学生具有一些相同的特征比如姓名、性别、年龄,因此只需要定义这些特征一次就可以了。可以在不同的类里分开定义这些相同的特征,这样该特征会有一个不同的命名空间。比如,一个学生的 greeting 可以是 “Yo, I’m [firstName]” (例子 Yo, I’m Sam),老师的可能会正式一些,比如"Hello, my name is [Prefix] [lastName]" (例子 Hello, My name is Mr Griffiths)。

注:多态——这个高大上的词正是用来描述多个对象拥有实现共同方法的能力。

根据子类创建对象吧
在这里插入图片描述

实践一下?

一个简单的例子

1.普通函数,先试试定义一个Person

function createNewPerson(name) {
  var obj = {};
  obj.name = name;
  obj.greeting = function () {
    alert('Hi! I\'m ' + this.name + '.');
  }
  return obj;
}

2.调用这个函数创建一个新的叫 LXY的人,在浏览器console 试试效果 :

var LXY = createNewPerson('LXY');
LXY.name;
LXY.greeting();

在这里插入图片描述
上述代码运行良好,但是有点冗长;如果我们知道如何创建一个对象,就没有必要创建一个新的空对象并且返回它。幸好 JavaScript 通过构建函数提供了一个便捷的方法,方法如下:

function Person(name) {
  this.name = name;
  this.greeting = function() {
    alert('Hi! I\'m ' + this.name + '.');
  };
}

这个构建函数是 JavaScript 版本的类。您会发现,它只定义了对象的属性和方法,除了没有明确创建一个对象和返回任何值和之外,它有了您期待的函数所拥有的全部功能。这里使用了this关键词,即无论是该对象的哪个实例被这个构建函数创建,它的 name 属性就是传递到构建函数形参name的值,它的 greeting() 方法中也将使用相同的传递到构建函数形参name的值。

注: 一个构建函数通常是大写字母开头,这样便于区分构建函数和普通函数。

  1. 调用后见函数,创建新实例

将下面的代码加在之前的代码下面:

var person1 = new Person('Lxy1');
var person2 = new Person('Lxy2');

保存并刷新浏览器,在 console 里输入如下代码:

person1.name
person1.greeting()
person2.name
person2.greeting()

在这里插入图片描述

在这里插入图片描述

现在看到页面上有两个对象,每一个保存在不同的命名空间里,当您访问它们的属性和方法时,您需要使用person1或者person2来调用它们。尽管它们有着相同的name属性和 greeting()方法它们是各自独立的,所以相互的功能不会冲突。注意它们使用的是自己的 name 值,这也是使用 this 关键字的原因,它们使用的从实参传入形参的自己的值,而不是其它的什么值。

可是,每次当我们调用构造函数时,我们都会重新定义一遍 greeting(),这不是个理想的方法。为了避免这样,我们可以在原型里定义函数,接下来我们会讲到。

创建最终的构造函数

1.移除掉之前写的所有代码, 用如下构造函数替代 —— 实现原理上,这与我们之前的例子并无二致, 只是变得稍稍复杂了些:

function Person(first, last, age, gender, interests) {
  this.name = {
    'first': first,
    'last': last
  };
  this.age = age;
  this.gender = gender;
  this.interests = interests;
  this.bio = function() {
    alert(this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + ' and ' + this.interests[1] + '.');
  };
  this.greeting = function() {
    alert('Hi! I\'m ' + this.name.first + '.');
  };
};

接下来加上这样一行代码, 用来创建它的一个对象:

var person1 = new Person('L', 'xy', 20, 'female', ['music', 'playing']

在这里插入图片描述

您就可以像我们定义第一个对象一样访问它的属性和方法了:

person1['age']
person1.interests[1]
person1.bio()

在这里插入图片描述

一些适用的创建对象的方式

1.Object()构造函数

使用Object()构造函数来创建一个新对象。 (创建了一个空的对象)

在浏览器中的控制台中输入以下代码:

var person1 = new Object();

这样就在person1变量中存储了一个空对象。然后, 可以根据需要, 使用点或括号表示法向此对象添加属性和方法;
试试这个例子:

person1.name = 'Lxy';
person1['age'] = 20;
person1.greeting = function() {
  alert('Hi! I\'m ' + this.name + '.');
}

还可以将对象文本传递给Object() 构造函数作为参数, 以便用属性/方法填充它。请尝试以下操作:

var person1 = new Object({
  name : 'Lxy',
  age : 20,
  greeting : function() {
    alert('Hi! I\'m ' + this.name + '.');
  }
});

2.使用create()方法

JavaScript有个内嵌的方法create(), 允许您基于现有对象创建新的对象。

在 JavaScript 控制台中尝试此操作:

var person2 = Object.create(person1);

现在尝试这个:

person2.name
person2.greeting()

person2是基于person1创建的, 它们具有相同的属性和方法。这非常有用, 因为它允许创建新的对象而无需定义构造函数。
缺点是比起构造函数,浏览器在更晚的时候才支持create()方法(IE9, IE8 或甚至以前相比), 加上一些人认为构造函数让代码看上去更整洁 —— 可以在一个地方创建构造函数, 然后根据需要创建实例, 这让您能很清楚地知道它们来自哪里。

但是, 如果您不太担心对旧浏览器的支持, 并且您只需要一个对象的一些副本, 那么创建一个构造函数可能会让您的代码显得过度繁杂。这取决于自己咯。有些人觉得create() 更容易理解和使用。

好啦,今天就到这里啵~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值