1.面向对象:继承
面向对象三大特点:封装 继承 多态
封装:将描述同一个东西的属性和方法,定义在一个对象中
继承:父对象中的属性和方法,子对象可直接使用
多态:同一个对象,在不同情况下,呈现不同的状态
重写 和 重载
重载:同一方法名,传入参数不同,执行不同的操作
重写:子对象觉得父对象的成员不好用,可自己定义一个,覆盖父对象的成员
创建对象:3种:
1. var obj={ "属性名1":值1,
"属性名2":值2,...,
"方法名1":function(){this.属性名;...},...
};
2. var obj=new Object();//创建一个空对象
obj.属性名=值;
obj.方法名=function(){...this.属性名...}
//因为书写不像封装,不常用
3. 利用构造函数 反复 创建 相同结构 的对象
构造函数:描述一类对象结构的特殊函数
2步:
1 定义构造函数
function 构造函数名|类型名(属性参数1,...){
this.属性名=属性参数1;
//在当前正在创建的对象中创建一个属性名,
//赋值为属性参数1的值
...
this.方法名=function(){
...this.属性名...
}
}
2 利用构造函数创建对象
var obj=new 构造函数名|类型名(属性值1,...);
new:1.创建一个空对象 :new obj={}
2.用空对象,调用构造函数
构造函数在空对象中添加属性和方法
3.设置虚拟对象的__proto__指向构造函数的prototype对象
(所有对象都有属性__proto__
4.返回新对象的地址。
继承:js中一切继承都是用原型对象实现的!
原型对象:每个函数对象都有一个原型对象
构造函数的原型对象负责保存所有子对象共享的成员!
建议:所有子对象共享的方法,都应定义在构造函数的原型对象中。
---避免重复定义方法对象。浪费内存
说明:其实所有内置类型的API都是定义在类型.prototype
扩展对象属性:2种扩展:
1.扩展共有属性:通过构造函数.prototype添加的属性
2.扩展自有属性:通过某一个具体子对象添加的属性
判断自有属性或共有属性
1.判断自有属性: obj.hasOwnProperty('属性名')
2.判断共有属性: "属性名" in obj //==>原型和子对象都找,只要有任何一个地方有,就能用
("属性名" in obj)&&(!obj.hasOwnProperty('属性名'))
在原型关系中包含 且 子对象自己没有 => 是共有属性
删除属性: delete 对象.属性名 //
仅能删除当前对象自己的属性,无法删除共有属性
全局变量:3种:
var n=1; | window.n=1; | window['n']=1;
以var删除的 window.n window['n']
不能delete ?不能delete 可被delete
window['n']=1
window['n']=1
delete window.n
alert(n);
VM646:2 Uncaught ReferenceError: n is not defined(anonymous function)
原型链:由各级对象的__proto__逐级继承形成的关系
获得任意对象的父级原型对象:
Object.getPrototypeOf(子对象)
=> 子对象.__proto__
lilei.__proto__ ->Student.prototype.__proto__ ->Object.prototype .__proto__:null
function Student prototype -> Function ->Object
var arr=[];Object.getPrototypeOf(arr)
[]
Object.getPrototypeOf(arr)==Array.prototype
true
Object.getPrototypeOf(Object.getPrototypeOf(arr))
Object {}
/?以{}创建的函数,没有构造函数,他的.__proto__直接指向object
eg:
var monkey={hair:true,feeds:'bananas'};
function Human(name){this.name=name;};
Human.prototype=monkey;
var geoge=new Human('Geoge');
console.log(monkey.isPrototypeOf(geoge));//true
检查对象的父对象:父对象.isPrototypeOf(子对象)
-----------------------------------------------------------
__proto__ 指向父级对象的属性
面向对象三大特点:封装 继承 多态
封装:将描述同一个东西的属性和方法,定义在一个对象中
继承:父对象中的属性和方法,子对象可直接使用
多态:同一个对象,在不同情况下,呈现不同的状态
重写 和 重载
重载:同一方法名,传入参数不同,执行不同的操作
重写:子对象觉得父对象的成员不好用,可自己定义一个,覆盖父对象的成员
创建对象:3种:
1. var obj={ "属性名1":值1,
"属性名2":值2,...,
"方法名1":function(){this.属性名;...},...
};
2. var obj=new Object();//创建一个空对象
obj.属性名=值;
obj.方法名=function(){...this.属性名...}
//因为书写不像封装,不常用
3. 利用构造函数 反复 创建 相同结构 的对象
构造函数:描述一类对象结构的特殊函数
2步:
1 定义构造函数
function 构造函数名|类型名(属性参数1,...){
this.属性名=属性参数1;
//在当前正在创建的对象中创建一个属性名,
//赋值为属性参数1的值
...
this.方法名=function(){
...this.属性名...
}
}
2 利用构造函数创建对象
var obj=new 构造函数名|类型名(属性值1,...);
new:1.创建一个空对象 :new obj={}
2.用空对象,调用构造函数
构造函数在空对象中添加属性和方法
3.设置虚拟对象的__proto__指向构造函数的prototype对象
(所有对象都有属性__proto__
4.返回新对象的地址。
继承:js中一切继承都是用原型对象实现的!
原型对象:每个函数对象都有一个原型对象
构造函数的原型对象负责保存所有子对象共享的成员!
建议:所有子对象共享的方法,都应定义在构造函数的原型对象中。
---避免重复定义方法对象。浪费内存
说明:其实所有内置类型的API都是定义在类型.prototype
扩展对象属性:2种扩展:
1.扩展共有属性:通过构造函数.prototype添加的属性
2.扩展自有属性:通过某一个具体子对象添加的属性
判断自有属性或共有属性
1.判断自有属性: obj.hasOwnProperty('属性名')
2.判断共有属性: "属性名" in obj //==>原型和子对象都找,只要有任何一个地方有,就能用
("属性名" in obj)&&(!obj.hasOwnProperty('属性名'))
在原型关系中包含 且 子对象自己没有 => 是共有属性
删除属性: delete 对象.属性名 //
仅能删除当前对象自己的属性,无法删除共有属性
全局变量:3种:
var n=1; | window.n=1; | window['n']=1;
以var删除的 window.n window['n']
不能delete ?不能delete 可被delete
window['n']=1
window['n']=1
delete window.n
alert(n);
VM646:2 Uncaught ReferenceError: n is not defined(anonymous function)
原型链:由各级对象的__proto__逐级继承形成的关系
获得任意对象的父级原型对象:
Object.getPrototypeOf(子对象)
=> 子对象.__proto__
lilei.__proto__ ->Student.prototype.__proto__ ->Object.prototype .__proto__:null
function Student prototype -> Function ->Object
var arr=[];Object.getPrototypeOf(arr)
[]
Object.getPrototypeOf(arr)==Array.prototype
true
Object.getPrototypeOf(Object.getPrototypeOf(arr))
Object {}
/?以{}创建的函数,没有构造函数,他的.__proto__直接指向object
eg:
var monkey={hair:true,feeds:'bananas'};
function Human(name){this.name=name;};
Human.prototype=monkey;
var geoge=new Human('Geoge');
console.log(monkey.isPrototypeOf(geoge));//true
检查对象的父对象:父对象.isPrototypeOf(子对象)
-----------------------------------------------------------
__proto__ 指向父级对象的属性