javascript 中的继承实现, call,apply,prototype,构造函数
function foo() {
if (!this.s_name) { // 避免被this的属性重新赋值
this.s_name = "inside foo";
}
console.info(this.s_name);
}
function bar() {
if (!this.s_name) {
this.s_name = "inside bar";
}
}
var p = new bar();
foo.call(p);// foo函数调用,由于使用了call,其上下文切换成p,foo函数中的this指向p
output:inside bar
/**
* Created by Administrator on 2016/12/4 0004.
*/ function Person() {
this.s_name = "Person"
this.s_age = undefined;
this.s_gender = undefined;
this.f_say = function (txt) {
console.info("%s say:%s", this.s_name, txt)
}
}
// Person test
var p = new Person();
p.f_say('hello'); // Person对象的正常调用 // Man 继承了Person中所有的属性和方法
function Man() {
Person.call(this, this.arguments);// 这里理解下,Person()函数调用过程中,this执行Man,this.f_say=function(){}其实就是给Man执行的,可以认为给Man添加了几个属性和方法
this.s_name = "Man"; // 注意,如果这句话放在第一行,将被Person的构造函数中的this.s_name = "Person"重新赋值
this.f_playGame = function () {
console.info("Man like play game");
}
}
// Man test
var p_man = new Man();
p_man.f_say("hello"); // Man继承了Person中的f_say成员方法
// apply
function foo(arg1, arg2) {
this.s_name = "foo";
this.f_func = function (arg1, arg2) {
console.info(this.s_name + " " + arg1 + " " + arg2);// 这里的arg会按照作用域链和原型链综合查找
}
} function bar() {
this.s_name = "bar";
} var f = new foo("foo_arg1", "foo_arg2");
var b = new bar();
f.f_func.apply(b, ["apply_arg1", "apply_arg2"]); //调用foo类型的对象f中的f_func 方法,但是里面的this.s_name 其实是bar类型的对象b的
output:
bar apply_arg1 apply_arg2
function Person() {
this.s_name = "Person";
this.f_say = function () {
console.info(this.s_name)
}
}
function Man() {
this.s_name = "Man";
}
Man.prototype = new Person()
var p = new Man();
p.f_say();
output:
Man
function Person() {
this.s_name = "Person";
this.f_say = function () {
console.info(this.s_name);
}
}
function Man() {
this.parent_method = Person;
this.parent_method(this.arguments); // 执行时Person函数,里面的this其实是Man
this.s_name = "Man"; // 如果放在第一行,会被Person() 的执行覆盖
}
var p = new Man();
p.f_say();
output:
Man
javascript 中的继承实现, call,apply,prototype,构造函数的更多相关文章
- 关于JavaScript中实现继承,及prototype属性
感谢Mozilla 让我弄懂继承. JavaScript有八种基本类型,函数属于object.所以所有函数都继承自object.//扩展:对象,基本上 JavaScript 里的任何东西都是对象,而且 ...
- JavaScript学习13 JavaScript中的继承
JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...
- 浅谈JavaScript中的继承
引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...
- JavaScript中的继承(原型链)
一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.pro ...
- 博文推荐】Javascript中bind、call、apply函数用法
[博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...
- 彻底搞懂JavaScript中的继承
你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...
- 浅谈 JavaScript 中的继承模式
最近在读一本设计模式的书,书中的开头部分就讲了一下 JavaScript 中的继承,阅读之后写下了这篇博客作为笔记.毕竟好记性不如烂笔头. JavaScript 是一门面向对象的语言,但是 ES6 之 ...
- javascript中各种继承方式的优缺点
javascript中实现继承的方式有很多种,一般都是通过原型链和构造函数来实现.下面对各种实现方式进行分析,总结各自的优缺点. 一 原型继承 let Super = functioin(name = ...
- javascript中实现继承的几种方式
javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Chi ...
- JavaScript中的bind,call和apply函数的用法和区别
一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...
随机推荐
- go 版本 gRPC 环境搭建(3.0正式版)
之前装过 gRPC 的各个测试版本,有些残余的文件,正式版的安装和之前残留的清除整理如下: 安装 go 版本的 gRPC go 的安装略过.需要 go 1.5 以上版本. $ go version ...
- Mybatis获取插入记录的自增长ID(转)
1.在Mybatis Mapper文件中添加属性“useGeneratedKeys”和“keyProperty”,其中keyProperty是Java对象的属性名,而不是表格的字段名. <ins ...
- 【转】MySQL数据丢失讨论
原文http://blog.sae.sina.com.cn/archives/4091 1. 概述 很多企业选择 MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么 ...
- Esfog_UnityShader教程_溶解效果Dissolve
溶解效果在游戏中是很常见的,比如在一些神话或者魔法世界中,一些NPC角色在剧情需要时候会身体会渐渐的消失掉.甚至有一些更炫的,比如用火焰喷射器把目标燃尽.这些都可以用到溶解效果.这篇文章主要是讲解一下 ...
- linux 网络编程比较好的文章
讲解epoll的, 算是比较详细的. 直接看使用部分就行. http://blog.csdn.net/xiajun07061225/article/details/9250579
- linux基础3——与XP共享文件夹的设置
导出linux文件有一般有三种方式: 1.类似windows下的文件直接拖拽,鼠标选中目标文件,从linux文件目录下直接拉至windows文件目录下: 2.U盘拷贝导出到Windows文件目录下:同 ...
- Python-5 数据类型、操作符
#1 数值类型: 整型int.浮点型float(科学记数法 e 或 E).布尔型bool #2 字符串: 与整型.浮点型转化:int()--截断处理 float() str() #3 获取数据类型: ...
- Linux 性能监控之命令行工具
引言 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.这些命令行工具可以在各种Linux系统下使用,可以用于监控和查找产生性能问题的原因.这个命令行工具列表提供了足够的 ...
- 块状元素(div)与内联元素(span)
<pre class="html" name="code"><html xmlns="http://www.w3.org/1999/ ...
- sox linux 下运用
1.下载SOX sox-14.4.1.tar.gz 2.安装sox文件 1)解压 tar -zxvf sox-14.4.1.tar.gz 2)进入sox14.4.1目录中执行./configure 3 ...