`
meladet
  • 浏览: 27247 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Javascript 继承小结

阅读更多

对象                                                                                                                                                            

对象是已命名的数据的集合。这些已命名的属性被作为对象的属性来引用。如:person.name

Javascript中的对象可以当作关联数组来使用,如:person[“name”]=”jane”

对象的创建:var obj = new Object();

对象直接量:var obj = {}; var obj = {name:”joye”,age:11}

 

函数                                                                                                                                                            

函数是一个可执行的代码段,只需定义一次,可以多次调用。

function area(x,y){

  return x*y;

}

上面是一个长方形计算面积的函数,通过area(2,3)可以调用它。

Javascript中,函数也是一种数据类型,这意味着:

1、              函数也可以成为某个变量或者是某个对象的属性值。如:var rect = new Object(), rect.area = function(x,y){return x*y;}

2、              函数也可以有属性,如area.counter = 0; function area(x,y){area.counter++; return x*y;}area函数每被调用一次,counter加一

 

                                                                                                                                                              

Javascript中没有类这个概念,但是对象可以拥有属性,而属性的值又可以是函数类型的数据,那么我们可以模拟出类来。

var Person = function(){
  this.name = “jane”; //实例属性
  this.sayHi = function(){alert(“HI,” +this.name)} //实例方法
}
Person.MIN_AGE = 1; //类属性
Person.run = function(){} //类方法
 

上面定义的是一个Person类,其实是一个function对象。

实例属性:是指每个对象都具有的属性,它们各自维护了一份单独的拷贝,比如一个Person类的对象p,name属性就是p的实例属性,可以通过p.name访问,p.name=’kyle’修改。这些操作不会影响别的Person对象的属性值。

实例方法:它与实例属性很相似,只不过它是一个方法,而不是一个数据值。通过p.sayHi()可以调用。实例方法是每个对象都可以调用的方法,但是它并不需要每个对象都维护一份单独的拷贝,方法可以定义在类的原型中,所有的对象共享一个方法。

这里的sayHi()方法在每个实例中都会有一份拷贝,实例方法可以只维持一份拷贝在原型中,这样可以节省空间,在下面介绍了原型之后,在对类进行改进。

类属性:如上的Person.MIN_AGE = 1,它是Person类上的一个属性,跟Person的对象不相关,这个属性只能通过Person类自身来访问

类方法:只能通过Person类自身调用,不能通过Person的实例调用

实例创建                                                                                                                                                    

var p = new Person();  //生成了一个Person类的实例

new Person()分成两部分看,第一部分new创建了一个空的对象,第二部分Person()Person函数的调用,并且把第一部分创建出来的空对象当作是this关键字的值传递。那么这个新生成的对象就会执行Person函数内的代码,就有了属性name,值为”jane”,最后把这个对象设置为p的值。

 

构造函数                                                                                                                                                   

很明显Person函数在创建对象的时候起了初始化对象的作用。它就是创建Person类的构造函数。

构造函数的定义:是初始化一个对象的属性并且专门和New运算符一起使用的一个函数。

 

Prototype                                                                                                                                              

构造过程明白了,在看看new的过程,new 在创建了空对象之后,会给这个对象设置原型,其值是构造函数的prototype属性的值。

所有的函数都有一个prototype属性,当这个函数被定义的时候,prototype属性自动创建和初始化,初始化值是一个对象,这个对象只带有一个属性:constructor,它指回到和原型相关的那个构造函数,此处的Person()。这就是为什么每个对象都有一个constructor属性。

对象没有prototype属性,但是具有对构造函数的prototype的内部引用,也就是说对象可以从构造函数的原型中继承它属性和方法。继承的属性就和对象的常规属性一样,可以使用for..in..来枚举它们。

 

属性读写                                                                                                                                                     

读取属性的值:

当要读取一个对象o的属性p,首先检查o是否有一个名为p的对象,如果没有则查找oprototype中是否有一个名为p的属性。如果在prototype 内定义的实例不能找到属性或函数,它就会在 原型中查找,依此类推。原型继承就是使用这个机制来实现。

设置属性的值:

当要写入一个属性的值时,如果o中并不存在属性p时,Js不会直接去修改prototype中的p属性,因为prototype是一个类所共享的,如果由于一个对象去修改prototype的值,那么别的对象中的p属性值也跟着变化。

修改属性p的值:

Js所做的事情是在o中增加一个新的属性p,并且设置好值,之后在访问op属性时,直接就能在o中访问到p,而不用去访问原型中的p属性。这其实就是o中的p属性隐藏了原型中的p属性。

 

继承                                                                                                                                                          

Javascript中查找属性是通过:对象->原型1,如果原型1也是某个类的对象,则原型1也有一个原型2,那么查找过程就是:对象->原型1->原型2…这样形成一个原型链,Javascript中的继承就是基于这种机制的。

所以要实现继承,只要让子类的原型指向父类的对象。看个例子:

Var Animal = function(){}
Animal.prototype.sleep = function(){
  If(this.type) alert(this.type +”ZZZZ”);
  else alert(“ZZZZ”);
}
Var Dog = function(){
  This.type = “Dog”;
}
Dog.prototype = new Animal();// 把Dog的原型设置为Animal对象
d.sleep();// 提示:”DogZZZZ” 

这样Dog类就继承了 Animal类的sleep方法。在Animal原型中的方法和属性都能够被继承。

 

改进继承                                                                                                                                                      

通过下面代码发现:

alert(d.constructor === Animal) // 值为true

alert(d.constructor === Dog) // 值为false

也就是说Dog对象的构造函数是Animal,而不是Dog,而实际上我们在new Dog()后执行的构造函数是Dog(),这样造成了类关系上的混乱,在修改了子类的prototype时,应该同时修改prototype中的constructor,保证子类自身准确。

改进的继承代码如下:

Var Animal = function(){}
Animal.prototype.sleep = function(){
  If(this.type) alert(this.type +”ZZZZ”);
  else alert(“ZZZZ”);
}
Var Dog = function(){
  This.type = “Dog”;
}
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog; //把Dog新的原型中的constructor指回为原来的constructor.
 

 

一个通用继承方法                                                                                                                                      

以下是一个继承的通用方法,摘自YUI源码:

function extend(subc, superc, overrides) {

    if (!superc||!subc) {
        throw new Error("extend failed, please check that " +
                        "all dependencies are included.");
    }
    var F = function() {};
    F.prototype=superc.prototype;
    subc.prototype=new F();// 修改子类的原型为父类对象
    subc.prototype.constructor=subc;//修改constructor
    subc.superclass=superc.prototype;//当类继承比较简单时,可以设置一个superclass属性,这样需要执行父类的方法时,可以通过superclass来调用
    if (superc.prototype.constructor == Object.prototype.constructor) {
        superc.prototype.constructor=superc;//如果父类的constructor没有指定,则修改为父类自身
    }
 
    if (overrides) { //需要覆盖的方法
        for (var i in overrides) {
            subc.prototype[i]=overrides[i];
        }
    }
}
 

 

 

分享到:
评论

相关推荐

    javascript继承的六大模式小结

    本文将深入探讨JavaScript继承的六大模式:原型链、借用构造函数、组合继承、原型式继承、寄生式继承以及寄生组合式继承。 1. **原型链** 原型链是JavaScript中最基础的继承方式,通过原型对象的引用实现。每个...

    Javascript 面向对象编程小结

    这篇博客“JavaScript 面向对象编程小结”可能涵盖了JavaScript中实现OOP的一些核心概念和技巧。 首先,面向对象编程的基础是类与对象。在JavaScript中,虽然没有像Java或C++那样的传统类机制,但是可以通过构造...

    javascript面试应急知识点小结

    这篇小结将聚焦于JavaScript的基础和进阶知识,帮助你在面试中表现出色。以下是对"javascript面试应急知识点小结"的详细解析。 一、基础概念 1. 变量与数据类型:JavaScript有七种数据类型,包括基本数据类型...

    JavaScript的继承实现小结

    JavaScript的继承机制是其面向对象编程的核心特性,它允许创建基于现有对象的新对象,从而实现代码的重用和扩展。JavaScript的继承主要有以下几种实现方式: 1. **原型链继承**(Prototype Inheritance): - 原型...

    JavaScript常见继承模式实例小结

    JavaScript继承模式是该语言面向对象编程核心特性之一,它允许开发者以不同的方式从父对象或构造函数中继承属性和方法。接下来,将详细介绍JavaScript中几种常见的继承模式,并结合具体代码实例分析其实现技巧与注意...

    JavaScript模式中文[pdf] 百度云

     小结  第3章 字面量和构造函数  对象字面量  自定义构造函数  强制使用new的模式  数组字面量  JSON  正则表达式字面量  基本值类型包装器  错误对象  小结  第4章 函数  背景  回调模式  返回函数 ...

    6种JavaScript继承方式及优缺点(小结)

    JavaScript继承是面向对象编程中的核心概念,用于实现代码的重用和对象间的属性与方法的传递。在JavaScript中,有多种实现继承的方式,各有优缺点。以下是对6种JavaScript继承方式及其优缺点的详细说明: 1. 原型链...

    JavaScript类的继承方法小结【组合继承分析】

    在JavaScript中,类的继承是一种非常重要的概念,它允许我们创建一个类(子类)来继承另一个类(父类)的属性和方法。组合继承是实现继承的一种常用模式,它结合了原型链继承和借用构造函数(经典继承)两种方式的...

    js的继承方法小结(prototype、call、apply)(推荐).docx

    ### JavaScript 的继承方法小结(Prototype、Call、Apply) #### 一、JavaScript 原型继承 -- Prototype 在 JavaScript 中,“一切皆对象”。通过 `new` 关键字创建的对象是函数对象,而直接赋值的对象则是一般...

    JavaScript模式 斯托扬·斯特凡洛夫 著

    前言 第1章 简介 模式 JavaScript:基本概念 ECMAScript JSLint Co ole 第2章 基本技巧 编写可维护的代码 尽量少用全局变量 ...小结 ...小结 ...小结 ...小结 ...传统与现代继承模式的比较 使用类式继承时的预期结果 ...小结

    javascript面向对象创建对象的方式小结.docx

    ### JavaScript面向对象创建对象的方式小结 #### 一、引言 在JavaScript中,面向对象编程(OOP)是一种非常重要的编程范式。它通过创建和操作对象来组织代码,提高代码的复用性和可维护性。本文将详细介绍...

    javascript对象小结

    在深入探讨JavaScript对象的具体知识点之前,首先要指出的是,本文档...对象的创建、属性和方法的定义、原型链的实现机制以及继承等都是JavaScript中非常重要的知识点,理解这些概念对于深入学习JavaScript至关重要。

    JavaScript常用本地对象小结_.docx

    JavaScript是一种面向对象的编程语言,它的核心特性包括封装、聚集、继承和多态。封装允许我们将数据和相关的方法组织在一起,形成对象。聚集则是将一个对象包含在另一个对象内部,以此构建复杂的数据结构。继承使得...

    Java方法继承、方法重载、方法覆盖小结.doc

    Java 方法继承、方法重载、方法覆盖、小结 Java 编程语言中,方法继承、方法重载、方法覆盖是三个重要的概念,它们在软件开发中发挥着重要作用。 方法继承 方法继承是 Java 编程语言的一种机制,允许一个类继承另...

Global site tag (gtag.js) - Google Analytics