博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS-面向对象-继承
阅读量:5116 次
发布时间:2019-06-13

本文共 2773 字,大约阅读时间需要 9 分钟。

--参看文献;

--http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html

 

    比如,现在有一个"动物"对象的构造函数。

  function Animal(){

    this.species = "动物";

  }

    

  还有一个"猫"对象的构造函数。

  function Cat(name,color){

    this.name = name;

    this.color = color;

  }

  怎样才能使"猫"继承"动物"呢?

  一:构造函数绑定;

     使用 call 或者 apply方法;将父对象的构造函数绑定在子对象上;

     

    子对象构造函数中加一行:

  function Cat(name,color){

    Animal.apply(this, arguments);

    this.name = name;

    this.color = color;

  }

  var cat1 = new Cat("大毛","黄色");

  alert(cat1.species); // 动物

二、 prototype模式

 如果猫的prototype对象,指向一个animal实例,那么所有猫的实例,就能继承animal 了;

 Cat.prototype=new Animal();

 Cat.prototype.constructor=Cat;

 var c=new Cat("小猫",“黑色”)

 alert(c.species)

 

注意,解析:

  cat 的prototype 对象指向了一个animal实例;它相当于完全删除了原先的值;然后赋值给一个新的值

  原来任何一个prototype对象都有一个constructor属性,指向它的构造函数;

  有"Cat.prototype = new Animal();"这一行,Cat.prototype.constructor是指向Cat的;加了这一行以后,Cat.prototype.constructor指向   Animal。

  更重要的是,每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性。

  这显然会导致继承链的紊乱

 

这是很重要的一点,编程时务必要遵守。下文都遵循这一点,即如果替换了prototype对象,

  o.prototype = {};

那么,下一步必然是为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数。

  o.prototype.constructor = o;

三、 直接继承prototype

 

四、 利用空对象作为中介

 

五、 拷贝继承

 

//继续 我们的继承方面的知识;

function public(){
}
  public.prototype.publicAction="eat fuck sleep";
  public.prototype.publicTag="people";
  function student(name,age,grade){
  this.name=name;
  this.age=age;
  this.grade=grade;
}
//继承机制;
//prototype 实现继承;
//avascript规定,每一个构造函数都有一个prototype
//属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承
function extend(Child,Parent){
  var F=function (){};
   F.prototype=Parent.prototype;
  Child.prototype=new F();
  Child.prototype.constructor=Child;
}
//使用拷贝继承;
function extend2(Child,Parent){
  var p=Parent.prototype;
  var c=Child.prototype;
  for(var i in p){
  c[i]=p[i];
  }
}
function test(){
   extend2(student,public);
   var stu=new student("jack",18,99);
   alert(stu.name);
  alert(stu.publicAction);
}
//一些常用的属性和方法;
//isPrototypeOf();
//判断某个prototype对象和某个实例之间的关系;
//个方法用来判断,某个proptotype对象和某个实例之间的关系。
function show0(){
var stu=new student("jack",18,90);
alert(student.isPrototypeOf(stu));// false
var p=new public();
alert(public.prototype.isPrototypeOf(p)); //true
}
//hasOwnProperty()
//每个实例都有一个hasOwnPrototype():用来判断属性是属于本地还继承的呀;
function show8(){
var stu=new student("jack",19,99);
alert(stu.hasOwnProperty("publicAction"));
alert(stu.hasOwnProperty("name"));
}
//in 运算符号 用来判断,某个实例是否含有某个属性,不管值本地还是继承的;
function show12(){
var stu=new student("jack",19,90);
alert("name" in stu)
alert("xx" in stu)
}
//还可以用来遍历某个对象的所有属性的呀;
function show11(){
var stu=new student("jack",12,12);
for(var x in stu){
alert(x); //本地属性;
}
}
function show(){
// var stu=new student("jack",12,12);
var p=public.prototype;
for(var i in p){
//本地属性;
alert(i); //指着输出的是字段
alert(p[i]);//这个输出的字段的内容
}
}

 

转载于:https://www.cnblogs.com/mc67/p/4804051.html

你可能感兴趣的文章
jmeter(1)添加header和cookie
查看>>
jmeter接口上传图片功能
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
Vue 利用指令实现禁止反复发送请求
查看>>
找到树中指定id的所有父节点
查看>>
编码艺术-代码架构的思考
查看>>
如何合理使用数据库锁
查看>>
使用Xcode的Targets来管理开发和生产版本的构建
查看>>
便捷编程-Xcode常用第三方插件 (随时更新)_Swift版本
查看>>
1.5 使用电脑测试MC20的发送英文短信功能
查看>>
线性递推阶乘的逆元
查看>>
C#访问数据库的步骤
查看>>
畅销移动应用开发的10个步骤(转载)
查看>>
发现的问题
查看>>
今天新开通了博客
查看>>
使用go, gin, gorm编写一个简单的curd的api接口
查看>>
完美解释if-modified-since/not-modified 文件头的意义
查看>>
Syscall param open(filename) points to unaddressable byte(s)
查看>>
淘宝购物数据统计分析
查看>>
git常用命令
查看>>