JS 原型 & 继承
理解原型链
先看看http://www.ituring.com.cn/article/56184和http://www.cavabiao.com/prototype-and-inherit-of-javascript/
首先需要知道new的时候都发生了什么
总的来说就是new得到的对象的_proto_指向F的prototype
比如 new F(); 下面是turing社区的讲解
new 运算符接受一个类(函数)F 及其参数new F(arguments...) 
这一过程分为三步:
创建类的实例。这步是把一个空的对象的 _proto_ 属性设置为 F.prototype 。
初始化实例。函数 F 被传入参数并调用,关键字 this 被设定为该实例。
返回实例。
function New(f) {
  var n = {
    '__proto__': f.prototype
  }; /*第一步*/
  return function() {
    f.apply(n, arguments); /*第二步*/
    return n; /*第三步*/
  };
}
原型式继承
下面是最简单的使用原型的例子
function Point(x, y) {
  this.x = x;
  this.y = y;
}
Point.prototype = {
  print: function() {
    console.log(this.x, this.y);
  }
};
var p = new Point(10, 20);
p.print(); // 10 20
原型继承 简单来说就是修改该类(function)的prototype属性值 指向另一个对象
不过我们可以定义一个通用的方式来完成继承 这是 Douglas Crockford 提出的一种方案
定义如下函数
function object(o) {
  function F() {};
  F.prototype = o;
  return new F();
}
实际上这个函数就是ECMA5中定义的Object.create函
一个使用原型方式继承的例子
function object(o) {
  function F() {};
  F.prototype = o;
  return new F();
}
var person = {
  name: 'nico',
  friends: ['aaa', 'bbb', 'ccc']
}
var anotherPerson = object(person);
var yetAntherPerson = object(person);
anotherPerson.name = 'greg';
console.log(anotherPerson.name); //gerg//因为上一句为antherPerson增加一个name属性并赋值//原型name还是nico
console.log(yetAntherPerson.name); //nico
anotherPerson.friends.push('ddd'); //因为我这里是对friends做修改 所以不会为anotherPerson创建新的属性
// 查找anotherPerson下的friends属性 在其原型中找到了 所以这里的修改是原型中friends
console.log(anotherPerson.friends); //["aaa", "bbb", "ccc", "ddd"]
console.log(yetAntherPerson.friends); //["aaa", "bbb", "ccc", "ddd"]
anotherPerson.friends = ['ano1', 'ano2']; //虽然也是friends 但是这个friends后面紧接着是一个赋值符号 //所以这里是为anotherPerson创建一个新的属性
console.log(anotherPerson.friends); //["ano1","ano2"]
console.log(yetAntherPerson); //["aaa", "bbb", "ccc", "ddd"]
关于 实例 类 原型的关系 看这个图http://www.ituring.com.cn/download/01Yi3zzVQhOo
cf1 cf2... 都是CF类的实例 cf1 cf2...都拥有一个_proto_ 属性 指向其类的原型 所以cf1改的是原型的属性 其他的实例cf2 cf3去引用原型的变量话肯定是cf1修改过后
这样感觉很不好 对不对 我希望我继承的对象的属性都是独立的 不会因为其它对象的改变而变化
下面就得说组合式继承
组合式继承使用原型链的方式对原型的属性和方法做继承 通过借用构造函数的方式实现实例属性的继承
nction SuperType(name) {
    this.name = name;
    this.colors = ['red'];
}
SuperType.prototype = {
    constructor: SuperType, // 我这里是对整个prototype做重写  所以千万不要忘了constructor属性
    sayName: function() {
        console.log(this.name);
    }
}
// 上面可以简写为  //这样就不用手动指定constuctor的值
SuperType.prototype.sayName = function() {
    console.log(this.name);
}
function SubType(name, age) {
    SuperType.call(this, name); //继承属性//调用了SuberType这个构造函数 //相当于这里写上了this.name=name;this.colors=xxx
    this.age = age;
}
SubType.prototype = new SuperType(); //注意不要写为SubType.prototype=SuperType.prototype 这样的话constructor指向就不对了
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function() { //为原型添加函数  这样一来原型就有sayName sayAge两个方法了
    console.log(age);
}
console.log(SuperType.prototype);
console.log(SubType.prototype);
var superIns = new SuperType('super');
var subIns = new SubType('sub', 23);
console.log(superIns);
console.log(subIns);

JS 原型 & 继承的更多相关文章
- 【09-23】js原型继承学习笔记
		js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ... 
- JS原型继承与类的继承
		我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ... 
- js原型继承四步曲及原型继承图
		一:js原型继承四步曲 //js模拟类的创建以及继承 //动物(Animal),有头这个属性,eat方法 //名字这个属性 //猫有名字属性,继承Animal,抓老鼠方法 //第一步:创建父类 fun ... 
- JS原型继承和类式继承
		前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ... 
- 关于js原型继承
		js的每个类都有一个prototype对象 访问对象的属性时,会先访问到对象自身是否有定义这个属性 如果没有定义,就会去访问对象所属类型的prototype对象是否有此属性 原型继承就是把类型的pro ... 
- js原型继承
		原型链: Object(构造函数) object(类型(对象)) var o = {}; alert(typeof o); //结果是object alert(typeof Object); //结果 ... 
- js原型继承深入
		js采用原型继承来实现类的派生,但是原型链再深入点,我们又知道多少呢,现在不妨往下看: 先来一个原型继承: var M1 = function() { this.param = "m1's ... 
- 前端面试题总结二(js原型继承)
		今天这篇文章整理了JS原型和继承的一些知识点,面试的时候 基!本!都!会!问!还不快认真阅读下文,看看你还有哪些知识点需要掌握吧~ 1.原型链 基本思想:利用原型让一个引用类型继承另外一个引用类型的 ... 
- JS 原型继承的几种方法
		<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
随机推荐
- 不要再坑人啦!NSOperation才是苹果推荐使用的多线程技术!
			首先声明一下.小汤我在实际开发中呢,实际上也是喜欢用GCD多一点,由于用起来感觉更方便. 可是,事实是什么呢? 苹果推荐使用的实际上是NSOperation.所以希望对此没有研究的各位不要再在博客中误 ... 
- setTimeOut和setInterval详解
			setTimeout和setInterval的语法相同.它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码.不过这两个函数还是有区别的 ... 
- 有关std::map和std::vector的使用
			先说map吧. 最需要注意的就是:用下标访问map中的元素时,与使用下标访问vector的行为截然不同! 用下标访问不存在的元素时,将导致在map容器中添加一个新的元素,它的键即为该下标! 然而很多时 ... 
- C++链接库
			静态链接库在程序编译链接过程中就导入lib文件并且包含在生成的exe文件里,而动态链接库DLL是在程序运行中由程序加载和卸载的,也就是说它是动态的,当然动态链接库DLL也可以静态加载当做静态来用: 静 ... 
- 列求key出现的频率
			1 cat mc.log | grep LOGIN_GET | awk '{print $9}' | sort | uniq -c 
- 算法——A*——HDOJ:1813
			Escape from Tetris Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ... 
- linux Bash bug修复记录
- API各函数作用简介
			API各函数作用简介 1.控件与消息函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeI ... 
- DLL编写教程(绝对经典之作)
			DLL编写教程 半年不能上网,最近网络终于通了,终于可以更新博客了,写点什么呢?决定最近写一个编程技术系列,其内容是一些通用的编程技术.例如DLL,COM,Socket,多线程等等.这些技术的特点就是 ... 
- yii_CGridView_ajax_pagination_and_ajax_sort
			本文主要内容: 1, 正常情况下 CGridView 实现 Ajax 分页和排序的原理 2, 分页和排序无法Ajax的情况分析 3, 自定义分页(重写CLinkPager)后如何实现 Ajax 分页和 ... 
