js 面向对象相关知识
来源:互联网 发布:xcode c语言编程教程 编辑:程序博客网 时间:2024/05/29 09:49
属性类型
数据属性 访问器属性
数据属性的4个特性
1. configurable :表示能否删除属性,能否修改属性特性,或者能否改为访问器属性
2. enumerable: 表示能否通过for-in循环返回属性
3. writable: 表示能否修改属性的值
4. value:包含属性的数据值
注意:直接在对象上定义属性,前三个特性都为true
用Object.defineProperty()创建的属性,前三个特性为false
访问器属性的4个特性
1. configurable表示能否删除属性,能否修改属性特性,或者能否改为数据属性
2. enumerable表示能否通过for-in循环返回属性
3. get :在读取属性是调用的函数 默认值为undefined
4. set :在写入属性是调用的函数 默认值为undefined
方法:
1.Object.defineProperty() :修改属性默认的特性,接受3个参数 :对象名、属性名、描述符对象
2.Object.getOwnPropertyDescriptor() :访问属性的特性 ,接受2个参数:对象、属性;
创建对象:
对象的组成
属性:变量 ,状态 静态的 (属于某个对象的变量叫属性)
方法:函数 ,过程 动态的 (属于某个对象的函数叫方法)
一、工厂模式:在函数内部显示的创建对象,并将属性和方法赋值给它,然后返回它。
二、构造函数模式
1.没有显示的创建对象
2.直接将属性和方法赋值给this对象 ;(属性和方法属于谁就是谁,函数前面有new则失效)
3.没有return语句
4. 调用方法:
当作构造函数来调用(构造函数首字母大写)
作为普通函数调用(添加到window)
在另一个对象的作用域中调用 :call()或 apply()
5.缺点:使用构造函数,每个方法都要在每个实例上重新创建一遍
6.实例的constructor(构造函数属性)指向构造函数:person1.constructor==Person
7.创建的实例对象,既是Object的实例,又是构造函数的实例
三.原型模式
注意: 1创建的每个函数都有一个prototype属性,指向它的原型对象
2 Person.prototype 指向原型对象 ,Person.prototype.constructor 指向Person
3原型对象只会默认取得constructor属性,其他的属性和方法都是从Object继承
4 创建一个实例,内部包含一个指针[[Prototype]],指向原型对象
5可以通过对象实例访问constructor属性
6在实例中创建的属性会屏蔽原型中的属性(优先级)
7. delete 删除实例属性,恢复对原型属性的链接
8. 搜索顺序:先在实例中搜索,实例中有所需属性,则停止搜索,否则搜索原型
方法:
1. isPrototypeOf();判断原型对象
Person.prototype.isPrototypeOf(person1);
2. Object.getPrototypeOf();取得原型的值
Object.getPrototypeOf(person1.name);
3.hasOwnProperty();检测属性存在于实例中还是原型中,实例中则返回true
person1. hasOwnProperty(‘name’);
4. Object.getOwnPropertyDescriptor()
取得实例属性描述符
var descriptor=Object.getOwnPropertyDescriptor(person1,"name");
alert(descriptor.value); //
取得原型属性描述符
Object.getOwnPropertyDescriptor(Person.prototype,”name”);
5.Object.keys();返回可枚举属性的字符串数组
var keys=Object.keys(person1);//实例中
var keys=Object.keys(Person.prototype);//原型中
6. Object.getOwnProperty: 返回所有属性数组,包括constructor
var keys=Object.keys(person1);//实例中
alert(keys);
var keys=Object.getOwnPropertyNames(person1);//原型中
alert(keys);
7. in 操作符:单独使用,在for-in循环使用
单独使用:
无论属性存在于实例中还是原型中
alert(‘name’ in person1);//true
在for-in循环使用 :(可以用前面两个方法来代替)
返回所有能通过对象访问的、可枚举的属性,无论实例中还是原型中的属性
8.原型的动态性
1. 对原型对象做出的修改可以立即从实例中反映出来
2. 重写原型对象则不行,实例的指针指向原型,而不是构造函数
9 .原生引用类型的原型:
如:Object Array String等 都在其构造函数的原型上定义了方法
Array.prototype.sort();
也可以定义新方法
10.原型对象的问题
对于包含引用类型值的原型属性,会被所有实例共享
11.组合使用构造函数和原型模式
构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性
继承
一、原型链:利用原型让一个引用类型继承另一个引用类型的属性和方法
实现:让原型对象等于另一个类型的实例,重写原型对象,代之以一个新类型的实例
SubType.prototype=new SuperType();
结果:新原型中有新实例所拥有的全部属性和方法,其内部还有一个指针
指向SuperType的原型
搜索步骤:(1)实例,(2)SubType.prototype,(3)SuperType.prototype
1.默认的原型:
Object:所有函数的默认原型都是Object的实例
默认原型的prototype指向Object
2.确认原型和实例的关系:
instanceof: alert(instance instanceof Object);
isPrototypeOf(): alert(Object.prototype.isPrototypeOf(instance));
3. 定义方法:
(1)给原型添加方法,重写超类型中的方法,放在继承之后;
(2)不能使用对象字面量创建原型方法,这样会重写原型链
4. 原型链的问题:
(1)包含引用类型值的原型属性会被所有实例共享;
(2)在创建子类型的实例时,不能向超类型的构造函数中传递参数
二、借用构造函数(伪造对象,经典继承)
使用call() 和 apply() 方法 ,在(将来)新创建的实例对象上执行构造函数
function SubType(){
SuperType.call(this);
}
三、组合继承(伪经典类型)
1.使用原型链实现对原型属性和方法的继承,借用构造函数来实现对实例属性的继承
2. instanceof isPrototypeOf() 识别基于组合继承创建的对象
数据属性 访问器属性
数据属性的4个特性
1. configurable :表示能否删除属性,能否修改属性特性,或者能否改为访问器属性
2. enumerable: 表示能否通过for-in循环返回属性
3. writable: 表示能否修改属性的值
4. value:包含属性的数据值
注意:直接在对象上定义属性,前三个特性都为true
用Object.defineProperty()创建的属性,前三个特性为false
访问器属性的4个特性
1. configurable表示能否删除属性,能否修改属性特性,或者能否改为数据属性
2. enumerable表示能否通过for-in循环返回属性
3. get :在读取属性是调用的函数 默认值为undefined
4. set :在写入属性是调用的函数 默认值为undefined
方法:
1.Object.defineProperty() :修改属性默认的特性,接受3个参数 :对象名、属性名、描述符对象
2.Object.getOwnPropertyDescriptor() :访问属性的特性 ,接受2个参数:对象、属性;
创建对象:
对象的组成
属性:变量 ,状态 静态的 (属于某个对象的变量叫属性)
方法:函数 ,过程 动态的 (属于某个对象的函数叫方法)
一、工厂模式:在函数内部显示的创建对象,并将属性和方法赋值给它,然后返回它。
二、构造函数模式
1.没有显示的创建对象
2.直接将属性和方法赋值给this对象 ;(属性和方法属于谁就是谁,函数前面有new则失效)
3.没有return语句
4. 调用方法:
当作构造函数来调用(构造函数首字母大写)
作为普通函数调用(添加到window)
在另一个对象的作用域中调用 :call()或 apply()
5.缺点:使用构造函数,每个方法都要在每个实例上重新创建一遍
6.实例的constructor(构造函数属性)指向构造函数:person1.constructor==Person
7.创建的实例对象,既是Object的实例,又是构造函数的实例
三.原型模式
注意: 1创建的每个函数都有一个prototype属性,指向它的原型对象
2 Person.prototype 指向原型对象 ,Person.prototype.constructor 指向Person
3原型对象只会默认取得constructor属性,其他的属性和方法都是从Object继承
4 创建一个实例,内部包含一个指针[[Prototype]],指向原型对象
5可以通过对象实例访问constructor属性
6在实例中创建的属性会屏蔽原型中的属性(优先级)
7. delete 删除实例属性,恢复对原型属性的链接
8. 搜索顺序:先在实例中搜索,实例中有所需属性,则停止搜索,否则搜索原型
方法:
1. isPrototypeOf();判断原型对象
Person.prototype.isPrototypeOf(person1);
2. Object.getPrototypeOf();取得原型的值
Object.getPrototypeOf(person1.name);
3.hasOwnProperty();检测属性存在于实例中还是原型中,实例中则返回true
person1. hasOwnProperty(‘name’);
4. Object.getOwnPropertyDescriptor()
取得实例属性描述符
var descriptor=Object.getOwnPropertyDescriptor(person1,"name");
alert(descriptor.value); //
取得原型属性描述符
Object.getOwnPropertyDescriptor(Person.prototype,”name”);
5.Object.keys();返回可枚举属性的字符串数组
var keys=Object.keys(person1);//实例中
var keys=Object.keys(Person.prototype);//原型中
6. Object.getOwnProperty: 返回所有属性数组,包括constructor
var keys=Object.keys(person1);//实例中
alert(keys);
var keys=Object.getOwnPropertyNames(person1);//原型中
alert(keys);
7. in 操作符:单独使用,在for-in循环使用
单独使用:
无论属性存在于实例中还是原型中
alert(‘name’ in person1);//true
在for-in循环使用 :(可以用前面两个方法来代替)
返回所有能通过对象访问的、可枚举的属性,无论实例中还是原型中的属性
8.原型的动态性
1. 对原型对象做出的修改可以立即从实例中反映出来
2. 重写原型对象则不行,实例的指针指向原型,而不是构造函数
9 .原生引用类型的原型:
如:Object Array String等 都在其构造函数的原型上定义了方法
Array.prototype.sort();
也可以定义新方法
10.原型对象的问题
对于包含引用类型值的原型属性,会被所有实例共享
11.组合使用构造函数和原型模式
构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性
继承
一、原型链:利用原型让一个引用类型继承另一个引用类型的属性和方法
实现:让原型对象等于另一个类型的实例,重写原型对象,代之以一个新类型的实例
SubType.prototype=new SuperType();
结果:新原型中有新实例所拥有的全部属性和方法,其内部还有一个指针
指向SuperType的原型
搜索步骤:(1)实例,(2)SubType.prototype,(3)SuperType.prototype
1.默认的原型:
Object:所有函数的默认原型都是Object的实例
默认原型的prototype指向Object
2.确认原型和实例的关系:
instanceof: alert(instance instanceof Object);
isPrototypeOf(): alert(Object.prototype.isPrototypeOf(instance));
3. 定义方法:
(1)给原型添加方法,重写超类型中的方法,放在继承之后;
(2)不能使用对象字面量创建原型方法,这样会重写原型链
4. 原型链的问题:
(1)包含引用类型值的原型属性会被所有实例共享;
(2)在创建子类型的实例时,不能向超类型的构造函数中传递参数
二、借用构造函数(伪造对象,经典继承)
使用call() 和 apply() 方法 ,在(将来)新创建的实例对象上执行构造函数
function SubType(){
SuperType.call(this);
}
三、组合继承(伪经典类型)
1.使用原型链实现对原型属性和方法的继承,借用构造函数来实现对实例属性的继承
2. instanceof isPrototypeOf() 识别基于组合继承创建的对象
阅读全文
0 0
- js 面向对象相关知识
- 面向对象相关知识
- 【js】js面向对象相关
- js面向对象编程知识
- 面向对象的相关知识及理解
- JS对象的一些相关知识
- 原生js的面向对象相关
- 黑马程序员_面向对象中继承的相关知识
- 面向对象知识 63.89%
- 面向对象知识总结
- php面向对象知识
- 面向对象入门知识
- 面向对象知识总结
- PHP面向对象知识
- C#面向对象知识
- 面向对象知识一
- 面向对象知识二
- 面向对象知识回顾
- 关于如何在Android源码目录中建立自己的C工程,并用mm命令单独进行该C工程模块的编译,以及Android.mk的使用介绍(1)
- robot framework 连接数据库
- 每日掌握一个linux命令 之 进程管理命令 ps
- json 基础知识
- mysql语句的增删查改
- js 面向对象相关知识
- HDU6215
- 小米盒子增强版ROOT以及实现通过wifi进行adb
- 通用函数和条件表达式
- 【资讯】Raiden发布新产品:以太坊测试网将出现更简单的微支付
- 【资讯】福布斯:金融科技革命开端的尾声
- 【国际】墨西哥立法赋权央行监管加密货币初创企业
- 【观点】CFTC主席Giancarlo:支持区块链符合“国家利益”
- 【动态】Urbit将虚拟服务器Galaxy移至以太坊