原型继承 javascript

在谈到继承的时候 多半考虑的是 面向对象  参考javascript高级程序设计 javascript编程全解

例子1 

  function Person(name,age) {
    this.name = name;
    this.age = age;

    this.show = function() {
      console.log(this.name,this.age);
    }
  }

  var person1 = new Person(‘haha‘,20);

  var person2 = new Person(‘kaka‘,22);

  console.log(person1.show == person2.show);//false

  首先以构造函数的方式来创建对象的时候 发生了如下的步骤

  (1)创建一个对象

  (2)将构造函数的作用赋给这个对象(this指向这个对象)

  (3)执行构造函数中的代码(为新对象添加属性)

  (4)返回这个对象

但是会发现这样一个问题, 就是生成的对象的方法都要在实例中重新创建一遍  就是我们实现同样的任务要创建两个方法(对象) 因此考虑到原型链

创建的每一个函数都有一个原型属性,这个属性是一个指针,指向这样的一个对象(原型对象),这个对象包含特定类型的所有实例共享的属性和方法,这就是原型模式

  改写上面的例子

  function Person(name,age) {
    this.name = name;
    this.age = age;
  }
  Person.prototype.sayName = function() {console.log(this.name)};

  var person1 = new Person(‘haha‘,20);
  var person2 = new Person(‘kaka‘,21);

  person1.sayName();
  person2.sayName();
  console.log(person1.sayName === person2.sayName);//true

  Person的构造函数指向原型对象  Person.prototype  而原型对象的constructor属性指会Person的构造函数  也就是说当我们在实例化一个对象的实例时,原型对象会调用它的constructor属性来实例化这个对象,并且实例化的对象都有一个属性指向它的原型

在这里面看到会存在两部分属性或者方法 Person构造函数中的属性或者方法  Person.prototype原型对象的属性或者方法,是按下面的顺序进行查找的

  (1)对象自身的属性(上面的例子中Person构造函数)

  (2)隐式链接所引用的对象(构造函数原型对象)的属性

  (3)第2项中的对象的隐式链接所引用的对象的属性

  (4)反复按第3项的规则查找直至全部查找完毕(查找的终点是object.prototype对象)

上述的查找属性或者函数的方式按照一个链式的结构进行查找,也就是我们说的原型链,在javascript中将原型链作为实现继承的主要方式,其基本的思想是利用原型让一个引用类型继承另一个引用类型的属性或者方法

  

  function SuperType() {
    this.property = true;
  }

  SuperType.prototype.getSuperValue = function() {
    return this.property;
  };

  function SubType() {
    this.subproperty = false;
  }

  SubType.prototype = new SuperType();

  SubType.prototype.getSubValue = function() {
    return this.subproperty;
  };

  var instance = new SubType();
  console.log(instance.getSuperValue());//true

  

  

时间: 2024-09-20 10:49:55

原型继承 javascript的相关文章

javascript继承,原型继承,借用构造函数继承,混合继承

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

javascript基础集锦_Json——原型继承(十)

在传统的基于Class的语言如Java.C++中,继承的本质是扩展一个已有的Class,并生成新的Subclass. 由于这类语言严格区分类和实例,继承实际上是类型的扩展.但是,JavaScript由于采用原型继承,我们无法直接扩展一个Class,因为根本不存在Class这种类型. 但是办法还是有的.我们先回顾Student构造函数: function Student(props) { this.name = props.name || 'Unnamed'; } Student.prototyp

JavaScript原型继承的陷阱

JavaScript原型继承的陷阱 JavaScript默认采用原型继承.虽然没有类(class)的概念,它的函数(function)可以充当构造器(constructor).构造器结合this,new可以构建出类似Java的类.因此,JavaScript通过扩展自身能模拟类式(class-based)继承. JavaScript和其它面向对象语言一样,对象类型采用引用方式.持有对象的变量只是一个地址,而基本类型数据是值.当原型上存储对象时,就可能有一些陷阱. 先看第一个例子 var creat

JavaScript的原型继承

JavaScript是一门面向对象的语言.在JavaScript中有一句很经典的话,万物皆对象.既然是面向对象的,那就有面向对象的三大特征:封装.继承.多态.这里讲的是JavaScript的继承,其他两个容后再讲. JavaScript的继承和C++的继承不大一样,C++的继承是基于类的,而JavaScript的继承是基于原型的. 现在问题来了. 原型是什么? 原型我们可以参照C++里的类,同样的保存了对象的属性和方法.例如我们写一个简单的对象 function Animal(name) { t

[JavaScript原型继承理解一]

转:http://www.cnblogs.com/harolei/p/3740354.html 对于JavaScript的继承和原型链,虽然之前自己看了书也听了session,但还是一直觉得云里雾里,不禁感叹JavaScript真是一门神奇的语言.这次经过Sponsor的一对一辅导和自己回来后反复思考,总算觉得把其中的精妙领悟一二了. 1. JavaScript创建对象 在面向对象语言中,通常通过定义类然后再进行实例化来创建多个具有相同属性和方法的对象.但是在JavaScript中并没有类的概念

JavaScript 原型继承开端

1.原型继承本质       就javascript对象系统的实现来讲,对象并没有原型,而构造器有原型(构造器.prototype指向其原型).对象只有构造自某个原型的说法,并没有持有某个原型的说法.原型其实也是一个对象实例.原型的含义是指:如果构造器有一个原型对象A,则由该构造器创建的实例都必然复制自A. 2.空的对象是所有对象的基础 来看看以下代码: 1 <html> 2 <head> 3 <meta http-equiv="content-type"

javascript对象创建及原型继承的研究

今天总结了下javascript关于原型继承和对象创建方面的东西,因为javascript的原型继承在使用传统面向对象语言开发的同学看来比较怪异,原型继承确实比传统OOP语言的继承理解和运用起来困难一些,当然个人觉得传统OOP的继承相对比较简单,因为中规中矩. 下面逐个的用示例说明javascript中对象创建方式,专业一点叫什么模式,主要有直接单个创建:工厂模式:提出方法类函数公用方式:构造函数模式:构造函数+原型方式:使用原型本质的方式构建(这种受过李站的<悟透javascript>一书的

JavaScript中易犯的小错误-------常见错误七:原型继承问题

JavaScript中易犯的小错误-------常见错误七:原型继承问题 很大一部分的js开发者都不能完全掌握原型的继承问题.下面具一个例子来说明:BaseObject = function(name) {if(typeof name !== "undefined"){ this.name = name; }else{ this.name = 'default' } };这段代码看起来很简单.如果你有name值,则使用它.如果没有,则使用 ‘default’:var firstObj

node.js javascript理解原型继承

util.inherits util.inherits(constructor, superConstructor)是一个实现对象间原型继承的函数. JavaScript 的面向对象特性是基于原型的,与常见的基于类的不同.JavaScript 没有提供对象继承的语言级别特性,而是通过原型复制来实现的 var util = require('util'); function Base() { this.name = 'base'; this.base = 1991; this.sayHello =