理解原型链

先看看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 被设定为该实例。
返回实例。

  1. function New(f) {
  2. var n = {
  3. '__proto__': f.prototype
  4. }; /*第一步*/
  5. return function() {
  6. f.apply(n, arguments); /*第二步*/
  7. return n; /*第三步*/
  8. };
  9. }

原型式继承

下面是最简单的使用原型的例子

  1. function Point(x, y) {
  2. this.x = x;
  3. this.y = y;
  4. }
  5. Point.prototype = {
  6. print: function() {
  7. console.log(this.x, this.y);
  8. }
  9. };
  10.  
  11. var p = new Point(10, 20);
  12. p.print(); // 10 20

原型继承 简单来说就是修改该类(function)的prototype属性值 指向另一个对象

不过我们可以定义一个通用的方式来完成继承 这是 Douglas Crockford 提出的一种方案
定义如下函数

  1. function object(o) {
  2. function F() {};
  3. F.prototype = o;
  4. return new F();
  5. }

实际上这个函数就是ECMA5中定义的Object.create函

一个使用原型方式继承的例子

  1. function object(o) {
  2. function F() {};
  3. F.prototype = o;
  4. return new F();
  5. }
  6.  
  7. var person = {
  8. name: 'nico',
  9. friends: ['aaa', 'bbb', 'ccc']
  10. }
  11.  
  12. var anotherPerson = object(person);
  13. var yetAntherPerson = object(person);
  14. anotherPerson.name = 'greg';
  15.  
  16. console.log(anotherPerson.name); //gerg//因为上一句为antherPerson增加一个name属性并赋值//原型name还是nico
  17. console.log(yetAntherPerson.name); //nico
  18.  
  19. anotherPerson.friends.push('ddd'); //因为我这里是对friends做修改 所以不会为anotherPerson创建新的属性
  20. // 查找anotherPerson下的friends属性 在其原型中找到了 所以这里的修改是原型中friends
  21.  
  22. console.log(anotherPerson.friends); //["aaa", "bbb", "ccc", "ddd"]
  23. console.log(yetAntherPerson.friends); //["aaa", "bbb", "ccc", "ddd"]
  24.  
  25. anotherPerson.friends = ['ano1', 'ano2']; //虽然也是friends 但是这个friends后面紧接着是一个赋值符号 //所以这里是为anotherPerson创建一个新的属性
  26. console.log(anotherPerson.friends); //["ano1","ano2"]
  27. console.log(yetAntherPerson); //["aaa", "bbb", "ccc", "ddd"]

关于 实例 类 原型的关系 看这个图http://www.ituring.com.cn/download/01Yi3zzVQhOo
cf1 cf2... 都是CF类的实例 cf1 cf2...都拥有一个_proto_ 属性 指向其类的原型 所以cf1改的是原型的属性 其他的实例cf2 cf3去引用原型的变量话肯定是cf1修改过后

这样感觉很不好 对不对 我希望我继承的对象的属性都是独立的 不会因为其它对象的改变而变化

下面就得说组合式继承
组合式继承使用原型链的方式对原型的属性和方法做继承 通过借用构造函数的方式实现实例属性的继承

  1. nction SuperType(name) {
  2. this.name = name;
  3. this.colors = ['red'];
  4. }
  5.  
  6. SuperType.prototype = {
  7. constructor: SuperType, // 我这里是对整个prototype做重写 所以千万不要忘了constructor属性
  8. sayName: function() {
  9. console.log(this.name);
  10. }
  11. }
  12. // 上面可以简写为 //这样就不用手动指定constuctor的值
  13. SuperType.prototype.sayName = function() {
  14. console.log(this.name);
  15. }
  16.  
  17. function SubType(name, age) {
  18. SuperType.call(this, name); //继承属性//调用了SuberType这个构造函数 //相当于这里写上了this.name=name;this.colors=xxx
  19. this.age = age;
  20. }
  21.  
  22. SubType.prototype = new SuperType(); //注意不要写为SubType.prototype=SuperType.prototype 这样的话constructor指向就不对了
  23. SubType.prototype.constructor = SubType;
  24. SubType.prototype.sayAge = function() { //为原型添加函数 这样一来原型就有sayName sayAge两个方法了
  25. console.log(age);
  26. }
  27.  
  28. console.log(SuperType.prototype);
  29. console.log(SubType.prototype);
  30. var superIns = new SuperType('super');
  31. var subIns = new SubType('sub', 23);
  32. console.log(superIns);
  33. console.log(subIns);

JS 原型 & 继承的更多相关文章

  1. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  2. JS原型继承与类的继承

    我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  3. js原型继承四步曲及原型继承图

    一:js原型继承四步曲 //js模拟类的创建以及继承 //动物(Animal),有头这个属性,eat方法 //名字这个属性 //猫有名字属性,继承Animal,抓老鼠方法 //第一步:创建父类 fun ...

  4. JS原型继承和类式继承

    前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...

  5. 关于js原型继承

    js的每个类都有一个prototype对象 访问对象的属性时,会先访问到对象自身是否有定义这个属性 如果没有定义,就会去访问对象所属类型的prototype对象是否有此属性 原型继承就是把类型的pro ...

  6. js原型继承

    原型链: Object(构造函数) object(类型(对象)) var o = {}; alert(typeof o); //结果是object alert(typeof Object); //结果 ...

  7. js原型继承深入

    js采用原型继承来实现类的派生,但是原型链再深入点,我们又知道多少呢,现在不妨往下看: 先来一个原型继承: var M1 = function() { this.param = "m1's ...

  8. 前端面试题总结二(js原型继承)

    今天这篇文章整理了JS原型和继承的一些知识点,面试的时候  基!本!都!会!问!还不快认真阅读下文,看看你还有哪些知识点需要掌握吧~ 1.原型链 基本思想:利用原型让一个引用类型继承另外一个引用类型的 ...

  9. JS 原型继承的几种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. HTML5中video的使用一

    <!DOCTYPE html> <html> <head> <title>HTML5 </title> <meta http-equi ...

  2. 关于ajax的那些事

    什么是ajax AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. Ajax包含下列技术:基于 ...

  3. WPF属性与特性的映射(TypeConverter)

    1,定义一个类 public class Human { public string Name { get; set; } public Human Child { get; set; } } 2在X ...

  4. MQ学习(二)----ActiveMQ简介(转)

    1.  什么是ActiveMQ ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的.可扩展的.稳定的和安全的企业级消息通信.ActiveMQ使用A ...

  5. 关于Google指令(别提baidu)

    关于google指令 关于google指令 google为我们准备好了的"指令"(directive),可以最大限度帮助我们完成每一次搜索.这些指令其实就是一个个关键字,能让我们从 ...

  6. iScroll 4,把禁掉的:active样式还给我~

    iScroll这个移动端的滚动神器大家都非常熟悉了,直到现在仍是实现移动端Web滚动的首选方案之一... 当我接触移动端Web时iScroll已经有两个版本了,iScroll 4和iScroll 5, ...

  7. 单例模式java实现

    package Counter; public class Counter {     private int counter;     private static Counter instance ...

  8. 找出n个数中出现了奇数次的两个数

    如果是找只出现了奇数次的一个数, 那么我们从头异或一遍就可以. 那么如何找出现了奇数次的两个数呢? 首先我们还是从头异或一遍, 然后结果肯定不为0, 对于异或出来的结果, 如果这个数的某一位是1, 说 ...

  9. latex 常用小结

    在写论文,甚至有些课程的报告的时候,latex是常用的工具.这篇博文简单的记录了latex常用的一些内容. 1 基本模块 没用过latex的读者,最想问的问题莫过于latex的 “hello worl ...

  10. latex如何把目录页的页码去掉?

    页眉的显示与关闭,清空,还有样式之间的切换,需要用到如下几个命令: \pagestyle  用于设置当前页以及后续页面的页眉显示情况(可称为页版式).中间页版式可由\thispagestyle命令来指 ...