javascript学习笔记(十) js对象 继承_基础知识

1.原型链
//很少单独使用

复制代码 代码如下:

View Code
//定义 SuperClass类,有一个属性property和一个方法getSuperValue
function SuperClass() {
this.property = true;
}
SuperClass.prototype.getSuperValue = function() {
return this.property;
}

//定义SubClass类,有一个属性subproperty和后来添加的一个方法getSubValue
function SubClass() {
this.subproperty = false;
}

//SubClass类继承SuperClass类
SubClass.prototype = new SuperClass();

//SubClass类添加一个方法getSubValue
SubClass.prototype.getSubValue = function() {
return this.subproperty;
}

//创建SubClass类的实例
var instance = new SubClass();
alert(instance.getSuperValue());

2. 确定原型与实例的关系
第一种方式用 instanceof 操作符,用来测试实例和原型链中出现过的构造函数

复制代码 代码如下:

alert(instance instanceof Object); //true ,instance是Object的实例吗?
alert(instance instanceof SuperClass); //true ,instance是SuperClass的实例吗?
alert(instance instanceof SubClass); //true,instance是SubClass的实例吗?

第二种方式用 isPrototypeOf()方法,测试原型链中出现的原型

复制代码 代码如下:

alert(Object.prototype.isPrototypeOf(instance)); //true
alert(SuperClass.prototype.isPrototypeOf(instance)); //true
alert(SubClass.prototype.isPrototypeOf(instance)); //true

3. 用原型链继承定义方法时的注意点
定义方法是的顺序:

复制代码 代码如下:

View Code
function SuperClass() {
this.property = true;
}
SuperClass.prototype.getSuperValue = function() {
return this.property;
}

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

//SubClass继承SuperClass
SubClass.prototype = new SuperClass(); //这个要先写,新添加的方法和重写超类的方法要写在后面,否则重写的超类方法将永远无法调用

//添加新方法
SubClass.prototype.getSubValue = function() {
return this.subproperty;
}
//重写超类的方法
SubClass.prototype.getSuperValue = function() {
return false;
}
var instance = new SubClass();
alert(instance.getSuperValue()); //fales,这里SubClass的实例调用了SubClass的getSuperValue()方法,而屏蔽了SuperClass的getSuperValue()方法,
//使用SuperClass的方法会调用SuperClass的getSuperValue()方法

原型链继承的缺点:1)共享超类中的属性,2)在创建子类时不能向超类的构造函数传递参数。所有很少单独使用原型链

4.借用构造函数
//很少单独使用

优点:可以向超类传递参数 。缺点:函数无法复用,所有类都要使用构造函数模式

复制代码 代码如下:

View Code
function SuperClass(name) {
this.name = name;
}
function SubClass(){
SuperClass.call(this,"RuiLiang"); //继承了SuperClass,同时向SuperClass传递了参数
this.age = 29; //实例属性
}

var instance = new SubClass();
alert(instance.name); //RuiLiang
alert(instance.age); //29

6.组合继承
//最常用的继承模式

复制代码 代码如下:

View Code
//创建SuperClass
function SuperClass(name) {
this.name = name;
this.colors = ["red","blue","green"];
}
SuperClass.prototype.sayName = function() {
alert(this.name);
}

////创建SubClass
function SubClass(name,age) {
SuperClass.call(this,name); //继承属性
this.age = age; //自己的属性
}

SubClass.prototype = new SuperClass(); //继承方法
SubClass.prototype.sayAge = function() { //SubClass添加新方法
alert(this.age);
};

//使用
var instance1 = new SubClass("RuiLiang",30);
instance1.colors.push("black");
alert(instance1.colors); //"red,blue,green,black"
instance1.sayName(); //"RuiLiang"
instance1.sayAge(); //30

var instance2 = new SubClass("XuZuNan",26);
alert(instance2.colors); //"red,blue,green"
instance2.sayName(); //"RuiLiang"
instance2.sayAge(); //30

7.其它继承模式
原型式继承、寄生式继承、寄生组合式继承

时间: 2024-09-04 11:06:30

javascript学习笔记(十) js对象 继承_基础知识的相关文章

javascript学习笔记(九) js对象 设计模式_基础知识

1.创建对象 复制代码 代码如下: var person = new Object(); person.name = "RuiLiang"; person.age = 30; person.job = "Teacher"; person.sayName = function () { alert(this.name); }; person.sayName(); 2.工厂模式 缺点:不能识别对象 复制代码 代码如下: function createPerson(nam

Javascript学习笔记9 prototype封装继承_基础知识

好,那就让我们一步步打造,首先让我们来看下继承原本的写法: 复制代码 代码如下: <script> var Person = function(name, age) { this.name = name; this.age = age; } Person.prototype.SayHello = function () { alert(this.name + "," + this.age); }; var Programmer = function (name, age,

javascript学习笔记(七) js函数介绍_基础知识

1.函数内部属性 arguments arguments用来保存函数的参数,arguments.callee指向拥有arguments对象的函数 复制代码 代码如下: //阶乘 function factorial(num) { if (num <= 1) { return 1; } else { return num*arguments.callee(num-1); //用agreements.callee代替 } } var trueFactorial = factorial; factor

JavaScript必知必会(七)js对象继承_基础知识

对象继承inherit var o = { r: }; var c = function f() { }; c.prototype = o; c.r = ; alert(o.r);//被继承的属性值未发生改变.alert(c.r);//c中r覆盖了o中的属性. 如何调用o中的r属性呢. var o = { r: }; var c = function f() { }; c.prototype = o; alert(o.r);// 被继承的属性值未发生改变. alert(c.r);//查询r属性,

JavaScript学习笔记整理_setTimeout的应用_基础知识

setTimeou的t应用 var ids = []; function foo1(i) { this.i = i; console.log('i = '+i); ids[0] = setTimeout((function () { foo1(i); }),1000); } function foo2(j) { this.j = j; console.log('j = '+j); ids[1] = setTimeout((function () { foo2(j); }),1000); } fo

JavaScript学习笔记记录我的旅程_基础知识

1.什么是JavaScript? (1) HTML只是描述网页长相的标记语言,没有计算,判断能力,如果所有计算,判断(比如判断文本框是否为空,判断两次密码是否输入一致)店铺放到服务器端执行的话网页的页面会非常的慢,用起来也很难用,对服务器的压力也很大,因此要求能在浏览器中执行一些简单的运算,判断,JavaScript就是一种在浏览器端执行的语言. (2) JavaScript和Java没有直接的关系,唯一的关系就是JavaScript原名LiveScript,后来吸取了Java的一些特性,升级为

JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型_基础知识

ECMAScript是一种动态类型的语言,构建于5种简单数据类型(Undefined.Null.Boolean.Number.String)和一种复杂数据类型(Object)的基础之上.这篇文章就来复习一下简单数据类型,我会尽量从编程实践的角度来描述,下面代码运行环境为FireFox 14.0.1. 简单数据类型 简单数据类型 取值 Undefined undefined(只有一个值) Null null(只有一个值) Boolean true|false(只有两个值) Number 数值 St

JavaScript 学习笔记之变量及其作用域_基础知识

一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义:var firstDemo; 二.变量的作用域 2.1基本概念 使用var 定义变量:定义该变量的作用域的局部变量,这种定义变量的方法也被成为显式声明. 这么说不理解的话可以看看下面这个简单粗暴的例子: 复制代码 代码如下: test(); function test(){ var firstDemo="hello";//定义局部变量    

javascript学习笔记(五)正则表达式_基础知识

常用到的元字符有: •. 查找单个字符,除了换行和行结束符: •\w 匹配字母.汉字.数字.下划线等符号: •\s 匹配空白符(包含空格.制表符等): •\d 匹配数字: •\b 匹配位于单词的开头或结尾的匹配: 常用的量词有: •^n 匹配任何开头为 n 的字符串: •n$ 匹配任何结尾为 n 的字符串: •n+ 匹配任何包含至少一个 n 的字符串: •n* 匹配任何包含零个或多个 n 的字符串: •n? 匹配任何包含零个或一个 n 的字符串: •n{X} 匹配包含 X 个 n 的序列的字符串