了解JavaScript 面向对象基础 & 原型与对象
面向对象语言中的对象
老是能听到什么基于对象, 面向对象. 什么是对象, 如果有面向对象基础的人可以无视了, 下面举个简单的例子给大家讲讲面向对象中, 对象的定义, 这个是比较通用的, 不过对于JS来说不太一样, 但是理解总是好的.
首先, 先有类型(Class), 这个类是指具有本质相同的一类事物, 比如大自然中的, 动物类, 植物类, 岩石类, 他们在根本上面具有本质相同的特性, 类下面也区分小的类, 比如同是动物类, 动物类里面也可以有猫类, 狗类, 当然啦, 人类也是一种类, 而在编程中, 类就是这一类东西用代码体现的一种抽象.
然后, 就有了对象(Object), 对象就是类中的一个个体, 比如人类中的一个人, 这就是对象, 再举些例子, 比如猫类中一只猫, 狗类里面具体到个体的一只狗, 都可以理解为对象, 在编程中, 对象就是类抽象出来的一个个体的实例.
可能上面说的有点晦涩, 但是久了就好理解了, 现在举点更具体的例子, 老师这一个职业, 算是一类人, 也就是类, 而你最喜欢的那个老师就是这个类的对象, 说白了就是类有种包含关系, 人类里面可以有男人类, 女人类, 也可以有教师类, 消防员类, 在日后的学习中, 大家也会知道, 这些小的类都可以称之为人类的子类, 也可以说这些类继承了人类, 而对象却不具备这种特性, 它只是某个类抽象到个体之后的单个实例(也就是实际的例子), 比如一位老师, 一个消防员, 这都是对象.
JS中的对象
JS中对对象的描述也差不太多, 只是JS是一种基于对象的语言, 并不是完全意义上的面向对象, 想要实现JS的类, 应该是一种使用函数模拟的方式, 所以可以这么说, JS中有模拟的类, 不存在真实意义上的类. 不过我们这里不纠结类, 着重讲对象.
上面说的让大家对对象也有一定理解了, 那么下面给大家再加一个新的概念, 那就是属性, 属性是一个对象的一些特点, 比如拿人作为一个对象, 那么人就有名字, 年龄, 身高, 体重这些特点, 这些特点也就是这个人作为一个对象的属性. 所以现在我们知道了, 一个对象它是具有很多属性的.
那么概念性的东西差不多了, 现在我们开始着重用代码讲对象.
首先我们先创建出一个对象.
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
var peron大家都知道, 变量的声明, 指向了一个对象, 对象的类型如上所示, {}中间用" : "分隔的属性和属性值, 通常我个人习惯称之为键值对(key-value), 这里面创建了一个对象, 这个对象共有三个属性, name, age, gender, 属性名, 也就是key, 这个key的类型没有特殊的限制(可以是值, 可以是字符串, 甚至于可以是另一个对象), 但是会通过toString()方法自动转化为字符串, 所以可以理解为key最后都会是一个字符串, 而value的类型没有特殊的限定(可以是值, 可以是字符串, 对象等等). 要注意的是, 属性是无序的, 所以声明的时候不需要注意顺序之类的.
对象创建方法
第一种, 使用{}包含键值对的方式创建对象(对象直接量).
var person = {
name : "Jianwei",
age : 23,
gender : "male"
profession : {
compang : "Oricle",
job : "iOS"
}
};
第二种, 使用new构造器关键字.
var person = new Object();
第三种, 使用Object.create()方法创建对象.
var person = Object.create({
name : "Jianwei",
age : 23,
gender : "male"
});
前两个方式比较好理解, 最后的这种方式, 简单介绍下, Object.create这个方法需要一个对象类型的参数, 创造出的对象的原型指向的就是这个参数, 这个参数是字面量对象, 原型指向的自然是Object.prototype了, 具体使用哪个, 要因地制宜.
对象属性的访问
对象的属性一般通过两种方式访问, 最常见的是通过点方法来进行访问, 也可以通过key索引的方式, 如上的代码案例.
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
如果我想要为oerson的name属性重新赋值, 那么使用如下语句的实现效果是相同的.
person.name = "Jianwei Wang";
person["name"] = "Jianwei Wang";
对象的原型(prototype)
这里我还是用不严谨的个人理解来给大家讲, 这样有助于大家理解, 当大家能够理解我的看法, 再去查看严谨的理论, 我相信这样的学习是更好令人消化的.
之前我们有讲父类和子类, 就比如人类, 和教师类, 人类是教师类的父类(super class), 教师类是人类的子类, 所以人类具有的所有属性, 教师类都继承了下来, 比如姓名, 年纪, 教师类也可以有自己新的, 父类所没有的属性, 比如教过了多少学生, 带过多少班级. 所以现在大家先给自己一个这样的思想, 就是父类的不作特殊修饰的属性, 子类都可以继承.
现在我们再来看JS中的对象, 首先, 有两种创建对象的方式, 上面说过了, 继承也简单的解释了, 那么很恶心的知识下面是, 建议大家用一天的时间来理解.
每个JS对象(null除外, 其实它本来自己有一个类型的, 但是官方那边修改之后发现, 大量的浏览器都出错了, 所以当使用typeof的时候, null显示的类型还是Object类型), 都和另一个对象相关联, "另一个"对象就是原型.
通过直接量创建的对象都继承自Object.prototype(这句代码其实是对原型对象的引用).
var person = {
name : "Jianwei",
age : 23,
gender : "male"
};
那么这个person对象继承的就是Object.prototype, 如果这时候为其添加了一个属性, 语句如下:
Object.prototype.hobby = "eat";
那么这个时候, 也能够从person上面访问到hobby这个属性, 也可以对hobby进行修改(能否修改会取决于一些条件, 我这段代码是允许, 后面会讲具体的设置方法).
通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值.
function person(){
name : "Jianwei",
age : 23,
gender : "male"
};
var jianweiWang = new person();
那么这个jianweiWang对象继承的就是person.prototype, 如果这时候为其添加了一个属性, 语句如下:
person.prototype.hobby = "eat";
那么这个时候, 也能够从jianweiWang上面访问到hobby这个属性, 也可以对hobby进行修改(能否修改会取决于一些条件, 我这段代码是允许, 后面会讲具体的设置方法).
这个继承关系也可以称之为原型链, jianweiWang继承的是person.prototype, 再往上继承的是Object.prototype, 所以如果Object.prototype上的属性, 几乎所有的对象都会有.
所以假如为一个对象的一个属性赋值, 首先会顺着原型链向上找, 如果整个原型链都没有, 才会为这个对象添加一个属性.
所有的继承来的属性并不是实际拥有了, 只是通过原型链获取到了, 复制给了自己一份, 所以假如上面的例子.
jianweiWang.hobby = "run";
但是这个时候打印person.prototype.hobby, 结果还是"eat", 因为只是副本变了, 本身并不会变.
了解JavaScript 面向对象基础 & 原型与对象的更多相关文章
- 第一百零九节,JavaScript面向对象与原型
JavaScript面向对象与原型 学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标 ...
- 03.JavaScript 面向对象精要--理解对象
JavaScript 面向对象精要--理解对象 尽管JavaScript里有大量内建引用类型,很可能你还是会频繁的创建自己的对象.JavaScript中的对象是动态的. 一.定义属性 当一个属性第1次 ...
- JavaScript 面向对象之原型对象
原型的概述 我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法. 逻辑上可以这么理解:prototype 通过调用构 ...
- JavaScript面向对象基础与this指向问题
前 言 我们的程序语言经历了从"面向机器".到"面向过程".再到"面向对象"的一个过程.而JavaScript是一 ...
- JavaScript中的原型和对象机制
1.对象相关的一些语言特性 JavaScript里所有的东西都是对象, 对象是属性的集合.要知道,函数也是对象, 能够作为变量的值. 返回值. 参数或者属性的值. 函数对象特殊的地方是能通过" ...
- JavaScript 面向对象与原型
ECMAScript有两种开发模式:1.函数式(过程化);2.面向对象(OOP); 一 创建对象1.普通的创建对象 ? 1 2 3 4 5 6 7 8 9 // 创建一个对象,然后给这个对象新的属性和 ...
- 对JavaScript 引擎基础:原型优化的研究 -----------------------引用
一.优化层级与执行效率的取舍 介绍了现代 JavaScript 引擎通用的工作流程: 我们也指出,尽管从高级抽象层面来看,引擎之间的处理流程都很相似,但他们在优化流程上通常都存在差异.为什么呢?为什么 ...
- javascript面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下来将为大家讲解在JS中面向对象的实现. 工厂 ...
- JavaScript面向对象和原型函数
对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!). 常用的几种对象创建模 ...
随机推荐
- MyBatis1:MyBatis入门
MyBatis是什么 MyBatis是什么,MyBatis的jar包中有它的官方文档,文档是这么描述MyBatis的: MyBatis is a first class persistence fra ...
- ucos实时操作系统学习笔记——任务间通信(信号量)
ucos实时操作系统的任务间通信有好多种,本人主要学习了sem, mutex, queue, messagebox这四种.系统内核代码中,这几种任务间通信机制的实现机制相似,接下来记录一下本人对核心代 ...
- Angular2笔记:NgModule
Angular的模块的目的是用来组织app的逻辑结构. 在ng中使用@NgModule修饰的class就被认为是一个ng module.NgModule可以管理模块内部的Components.Dire ...
- HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术
最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...
- js变量声明作用域问题
1.先来看两个题 var a = 1; foo1(); function foo1(){ console.log(a); //输出1 }; foo2(); var a = 1; function fo ...
- Windows 批处理
1. 引言 在Windows上,经常需要做一些重复的工作.比如在不同的工作场所需要切换不同的ip:比如有时需要对一堆文件按1~n进行重命名:再比如我们需要删除一大堆文件,这些文件名字都差不多, ...
- Hawk 2. 软件界面介绍
2. 软件界面介绍 1. 基本组件 Hawk采用类似Visual Studio和Eclipse的Dock风格,所有的组件都可以悬停和切换.包括以下核心组件: 左上角区域:主要工作区,任务管理. 下方: ...
- JavaScript与PHP中正则
一.JavaScript 有个在线调试正则的工具,点击查看工具.下面的所有示例代码,都可以在codepen上查看到. 1.创建正则表达式 var re = /ab+c/; //方式一 正则表达式字面量 ...
- ES6环境搭建及react-router学习
一.起因 ES6新纳入了很多振奋人心的新特性,真的很让人忍不住去尝试一下.不过,由于现在大部分的浏览器对ES6的支持程度都不是很好.所以如果想要放心地使用一些新特性,还需要用一些工具,将ES6或者ES ...
- 巡检脚本OS+Oracle
巡检脚本 主机巡检脚本:OSWatcher.sh Oracle巡检脚本:ORAWatcher.sh 脚本使用方法 1.建立脚本放置目录 # mkdir /var/collect 2.把脚本ORAWat ...