我觉得js的难点之一就是面向对象编程。

面向对象

它是一种编程思想,它在写法上比面向过程相对来说复杂一些;

以下是我学习中关于面向对象的知识点总结:

 

1、什么是对象 

从广义上说,"一切皆对象";狭义上说,是一种复合数据类型Object。

对象可以添加属性(变量)与方法(函数)

2、创建对象的方法

 ①:直接字面量  {}

var person={
name:'jackson',
age:30,
sing:function(){
console.log('beat it');
}
};
person.height='180CM';
person.interset=function(){
console.log('dancing');
};

②:使用关键字new    new Object()

var person1=new Object();
person1.name='jack';
person1.age=18;
person1.playgame=function(){
console.log('王者荣耀');
};

3、创建完的对象有两个特点

  ①:添加属性(属性的值为非函数的任意数据类型)

    描述对象的特征

  ②:添加方法(方法的值为函数)

    实现对象的一些功能

4、面向对象的写法特点

  ①:把变量写作属性;

  ②:会把功能写成一个函数;

  ③:这个函数是在对象身上的;

  ④:对象身上的功能可以继承。

5、如何封装一个函数

//工厂方式
function createPerson(name,age){
var obj=new Object; obj.name=name;
obj.age=age; obj.say=function(){
console.log('我叫'+obj.name);
} return obj;
} var p1=createPerson('Jackson',30);
var p2=createPerson('Jack',18); p1.say();
p2.say();

6、构造函数

创建并初始化对象的函数,并且要用new来调用函数,不用new调用的话与普通的函数就没有区别

通过构造函数new出来的对象叫实例,创造对象的过程叫实例化

构造函数存在一个问题:性能问题会造成资源浪费

function Person(name,age){
this.name=name;
this.age=age; this.say=function(){
console.log('my name:'+this.name);
};
}
var p1=new Person('Jackson',30); //一个实例
p1.say(); var p2=new Person('jack',18); //一个实例
p2.say();

7、原型(prototype)

  函数身上的属性,每一个函数身上都有这个属性,它的值是一个对象

   它身上可以放属性与方法,如果与构造函数相结合的话,通过构造函数创建的对象就会具有它身上的属性与方法

对象是通过构造函数创建的,那prototype就是这个对象的原型对象

建议把一些公用的属性或者方法都放到构造函数的原型身上,这样就可以解决构造函数的性能问题。

8、__proto__

  对象身上的属性,每一个对象身上都会有这个属性。它的值也是一个对象,它的值就是它对应的构造函数的prototype的值

  对象.__proto__===构造函数.prototype

  对象之所以能够继承原型身上的属性与方法,是因为每个对象身上都有一个__proto__,那__proto__的值指向了构造函数的prototype

function Person(name,age){
this.name=name;
this.age=age;
} Person.prototype.gender='男';
Person.prototype.say=function(){
console.log('my name:'+this.name);
}; var p1=new Person('Jackson',30); //一个实例
var p2=new Person('Jack',18); //一个实例 console.log(p1.__proto__===Person.prototype); //true

9、原型链

  对象与原型之间的关系(链接)

  原型链查找规则

    当我们调用一个对象身上的属性或者方法的时候,它就会有一个查找规则

    ①:首先会在自身去找,如果有的话就用自己的;

    ②:如果没有的话,它就在该对象的__proto__下查找,因为__proto__这个属性是指向对应的构造函数身上的protytpe,把它查找的时候找的就是构造函数的原型

    ③:如果原型身上也没有的话,那它会继续往外面找,直到找到最顶层的Object身上的prototype,如果都没有,则返回undefined

10、面向对象的写法

function 构造函数(){
this.属性=??;
}
构造函数.prototype.方法=function(){} var 实例对象=new 构造函数();
实例对象.方法();

11、constructor

概念:每个对象身上都会有这个属性,默认指向该对象对应的构造函数

   这个属性不是放在对象身上,放在对应的原型对象身上

作用:查看对象的构造函数

语法:对象.constructor

返回值:对象的构造函数

问题:这个属性是可以被修改的,所以最好重新指向一下

function Coder(name){
this.name=name;
}
Coder.prototype={
constructor:Coder, //重新指向,防止改变它的构造函数
age:18,
gender:'男'
};


















JS难点--面向对象(封装)的更多相关文章

  1. js之面向对象----封装篇

    学习了一天的面向对象总结一下,共分为三类 - -! 老规矩 第一部分是概念性知识!!! 面向对象编程,我们可以把他想象成我们在造人.一个对象便是一个人,这个人有胳膊有腿,这便是一个对象的属性或者方法. ...

  2. JS难点--面向对象(继承)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } 继承 让一个对象拥有另一个对象的属性或者 ...

  3. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js

    Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一  三个基本的特性:封装.继承与多态1 1.2. 魔 ...

  4. Atitit 面向对象  封装的实现原理

    Atitit 面向对象  封装的实现原理 1.1. 动态对象的模拟使用map+函数接口可以实现1 1.2. 在用结构体 + 函数指针 模拟 对象 1 1.3. This指针..1 1.4. " ...

  5. JS类的封装及实现代码

    js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样 用class来定义类, 但我们可以利用js的闭包封装机制来实现js类, 我们来封装一个简的Shape类. 1. ...

  6. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析

    作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  7. 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析

    作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  8. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  9. JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

随机推荐

  1. Python学习笔记011_模块_标准库_第三方库的安装

    容器 -> 数据的封装 函数 -> 语句的封装 类 -> 方法和属性的封装 模块 -> 模块就是程序 , 保存每个.py文件 # 创建了一个hello.py的文件,它的内容如下 ...

  2. 如何加固Linux系统

    如何加固Linux系统 一. 账户安全 1.1 锁定系统中多余的自建帐号 检查方法: 执行命令 #cat /etc/passwd #cat /etc/shadow 查看账户.口令文件,与系统管理员确认 ...

  3. Java开发规范总结(两周至少看一次)

     Service / DAO 层方法命名规约: 1 ) 获取单个对象的方法用 get 做前缀.2 ) 获取多个对象的方法用 list 做前缀.3 ) 获取统计值的方法用 count 做前缀.4 ) 插 ...

  4. 配置exVim开发环境

    exVim主页 http://exvim.github.io/ 使用该配置原因: 简单,组织各种优秀插件,安装包很小,各种操作很流畅 实用,对于项目来说,只需要多出一个xx.exvim文件,所有符号等 ...

  5. myeclipse快捷键(转载)

    非常感谢分享这篇文章的大虾..但是我忘了几下您的blog地址,因此无法注明原文地址...见谅哈 存盘 Ctrl+s(肯定知道) 注释代码 Ctrl+/ 取消注释 Ctrl+\(Eclipse3已经都合 ...

  6. Redis学习——Redis事务

    Redis和传统的关系型数据库一样,因为具有持久化的功能,所以也有事务的功能! 有关事务相关的概念和介绍,这里就不做介绍. 在学习Redis的事务之前,首先抛出一个面试的问题. 面试官:请问Redis ...

  7. Linux入门之常用命令(10)软连接 硬链接

    在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问. ...

  8. 51nod 1451 合法三角形 判斜率去重,时间复杂度O(n^2)

    题目: 这题我WA了3次,那3次是用向量求角度去重算的,不知道错在哪了,不得不换思路. 第4次用斜率去重一次就过了. 注意:n定义成long long,不然求C(3,n)时会溢出. 代码: #incl ...

  9. hdu3507 Print Article(斜率DP优化)

    Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it ...

  10. Ubuntu16.04下安装redis

    Ubuntu16.04下安装redis 保证网络畅通,选定好下载工作路径,执行以下命令下载redis-3.2.6: sudo wget http://download.redis.io/release ...