JS温习:基础(四) 继承,原型

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__ 指向父级对象的属性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值