高级javascript---原型和原型继承
高级javascript---原型和原型继承
在 JavaScript 中,prototype 是函数的一个属性,同时也是由构造函数创建的对象的一个属性。 函数的原型为对象。 它主要在函数用作构造函数时使用。
function Vehicle(wheels, engine) {
this.wheels = wheels;
this.engine = engine;
}
在上面的示例中,Vehicle 函数的原型是使用 Vehicle 构造函数实例化的任何对象的原型。
可以使用 prototype 属性向对象添加属性和方法,甚至于已创建的对象也是如此:
var testVehicle = new Vehicle(2, false);
Vehicle.prototype.color = "red";
var testColor = testVehicle.color;
testColor 的值为“red”。
你甚至可以向预定义的对象添加属性和方法。 例如,你可以在 String 原型对象上定义一个 Trim 方法,脚本中的所有字符串都将继承该方法。
String.prototype.trim = function()
{
// Replace leading and trailing spaces with the empty string
return this.replace(/(^\s*)|(\s*$)/g, "");
}
var s = " leading and trailing spaces ";
// Displays " leading and trailing spaces (35)"
window.alert(s + " (" + s.length + ")");
// Remove the leading and trailing spaces
s = s.trim();
// Displays "leading and trailing spaces (27)"
window.alert(s + " (" + s.length + ")");
使用原型通过 Object.create 从一个对象派生另一个对象
prototype 对象可用于从一个对象派生另一个对象。 例如,你可以使用 Object.create 函数派生使用我们之前定义的 Vehicle 对象的原型(以及所需的任何新属性)的新对象Bicycle。
var Bicycle = Object.create(Object.getPrototypeOf(Vehicle), {
"pedals" :{value: true}
});
Bicycle 对象具有属性 wheels、engine、color 和 pedals,并且其原型为 Vehicle.prototype。 JavaScript 引擎会查找 Bicycle 的 pedals 属性,并查看原型链以便查找Vehicle 的 wheels、engine 和 color。
更改对象的原型
在 Internet Explorer 11 中,可以通过 __proto 属性用新原型替换对象或函数的内部原型。 使用此属性时,将继承新原型的属性和方法以及其原型链中的其他属性和方法。
以下示例演示如何更改对象的原型。 此示例演示当更改对象原型时,对象的继承属性将如何更改。
function Friend() {
this.demeanor = "happy";
}
function Foe() {
this.demeanor = "suspicious";
}
var friend = new Friend();
var foe = new Foe();
var player = new Object();
player.__proto__ = foe;
friend.ally = "Tom";
if (console && console.log) {
console.log(player.demeanor === "happy" ); // Returns false
console.log(player.demeanor === "suspicious"); // Returns true
console.log(player.ally === "Tom"); // Returns false
// Turn the foe to a friend.
player.__proto__ = friend;
console.log(player.demeanor === "happy"); // Returns true
console.log(player.demeanor === "suspicious"); // Returns false
console.log(player.ally === "Tom"); // Returns true
}
上面是摘自http://msdn.microsoft.com/zh-cn/library/hh924508(v=vs.94).aspx上的原文。
下面是我从慕客网上看到的一个问题,仔细分析之后感觉挺有意思,于是记下录来。
仔细分析 Man.prototype = new People 与 Man.prototype = People.prototype 这两种继承的区别
function People (){
this.name = 'frog';
this.age = 29;
}
People.prototype.getName = function(){
return this.name;
}
function Man(){
this.name = 'rat';
this.age = 3;
}
Man.prototype = People.prototype;
//某一天,新来的小伙伴修改了这个方法
Man.prototype.getName = function(){
return this.age;
}
var p = new People;
var n = p.getName();
console.log(n); // 输出29而不是 frog
//说明直接用原开链,父类会被子类影响
所以一般不直接用对象原型,而是用对象的实例
function People (){
this.name = 'frog';
this.age = 29;
}
People.prototype.getName = function(){
return this.name;
}
function Man(){
this.name = 'rat';
this.age = 3;
}
Man.prototype = new People;
//再次修改原型上的方法
Man.prototype.getName = function(){
return this.age;
}
var p = new People;
var n = p.getName();
console.log(n); // frog 说明父类没有受影响
这样改,子类的修改就不会影响到父类了,不过这样做有一个缺点,一是每次实例化Man的时候都会new People, 二是People上的属性也会继承到Man上来,通常我们只想要继承父对象上的方法,不需要它的属性,所以,就出现了下面的用法
f = function(){};
f.prototype = People.prototype;
Man.prototyep = new f();
通过这样中转一下,就可以只继承People上的方法,而不承它的属性,同时子类的修改,不会影响到父类了。 如果您觉得这文章对您有帮助,请点击【推荐一下】,想跟我一起学习吗?那就【关注】我吧!
高级javascript---原型和原型继承的更多相关文章
- 《JAVASCRIPT高级程序设计》根植于原型链的继承
继承是面向对象的语言中,一个最为津津乐道并乐此不疲的话题之一.JAVASCRIPT中的继承,主要是依靠原型链来实现的.上一篇文章介绍过,JAVASCRIPT中,每一个对象都有一个prototype属性 ...
- JavaScript原型链与继承
最近学习了<Javascript高级程序设计>面向对象部分,结合书中的例子总结一下原型链和继承部分的内容. 创建对象 在Js当中没有类这个概念,当我们想要创建具有相同属性的对象的时候,有如 ...
- javascript中的原型继承
在Javascript面向对象编程中,原型继承不仅是一个重点也是一个不容易掌握的点.在本文中,我们将对Javascript中的原型继承进行一些探索. 基本形式 我们先来看下面一段代码: <cod ...
- JavaScript系列--浅析原型链与继承
一.前言 继承是面向对象(OOP)语言中的一个最为人津津乐道的概念.许多面对对象(OOP)语言都支持两种继承方式::接口继承 和 实现继承 . 接口继承只继承方法签名,而实现继承则继承实际的方法.由于 ...
- 浅谈Javascript中的原型、原型链、继承
构造函数,原型,实例三者的关系 构造函数: 构造函数是创建对象的一种常用方式, 其他创建对象的方式还包括工厂模式, 原型模式, 对象字面量等.我们来看一个简单的构造函数: function Produ ...
- 菜鸟快飞之JavaScript对象、原型、继承(三)
正文之前需要声明的一点是,菜鸟系列博文全是基于ES5的,不考虑ES6甚至更高版本. 继承 由于我个人不是学计算机的,所以对于很多东西只是知其然,不知其所以然.就像这个继承,刚开始学JavaScript ...
- 【转】JavaScript中的原型和继承
请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...
- web前端学习(二) javascript对象和原型继承
目录 1. JavaScrpt对象 2. 原型对象和继承 3. 对象的克隆 (1)javascript对象 在JS中,对象是属性的容器.对于单个对象来说,都由属性名和属性值构成:其中属性名需要是标识符 ...
- 理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...
- 对Javascript 类、原型链、继承的理解
一.序言 和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...
随机推荐
- 在一定[min,max]区间,生成n个不重复的随机数的封装函数
引:生成一个[min,max]区间的一个随机数,随机数生成相关问题参考→链接 var ran=parseInt(Math.random()*(max-min+1)+min); //生成一个[min,m ...
- CentOS 6.5 安全加固及性能优化 (转)
通过修改CentOS 6.5 的系统默认设置,对系统进行安全加固,进行系统的性能优化. 环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Centos-6.5- ...
- cordova插件开发注意事项
1. 编写插件,先创建好cordova项目之后,在项目里开发调试好在去创建插件目录 如何在cordova项目里创建呢,在android文件夹下面的res/xml/config.xml里去加入插件 例如 ...
- bzoj3380+3381+3382+3383 Usaco2004 Open
四道比较水的题 T1:SPFA+状压 #include<stdio.h> #include<string.h> #include<algorithm> #inclu ...
- STL之deque
deque是一种优化了的,对序列两段进行添加和删除操作的基本序列容器.它允许较为快速的随机访问,但它不像vector把所有对象保存在一块连续的内存块,而是采用多个连续的存储块.向deque两段添加或删 ...
- VB6.0 为批量字体改名
从网上下载了一个字符包,解压以后查看,发现文件名是这种形式:0120_XXXXXX_GBK.ttf,看上去很不雅观.我想改成 XXXXXX简体.ttf 这种形式,但字体有300多个,手动修改太浪费时间 ...
- python1
leetcode上面的很简单的题目 Given an integer (signed 32 bits), write a function to check whether it is a power ...
- 使用VS2013进行单元测试
这次的作业安装了VS2013,对于它的安装过程我就不再细说了,归结起来就是一个字——等,尤其是语言包,最后只好放弃了装语言包,凭借我3级半的英语水平,明白这些没有问题——这仅仅个玩笑话,其实我是用有道 ...
- 协议分析 - DHCP协议解码详解
协议分析 - DHCP协议解码详解 [DHCP协议简介] DHCP,全称是 Dynamic Host Configuration Protocol﹐中文名为动态主机配置协议,它的前身是 ...
- 学习笔记:java并发编程学习之初识Concurrent
一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...