js中call(),apply(),以及prototype的含义
最近段时间主要学习前端去了,然而所遇到的一些问题我觉得有必要去深究一下
prototype:
1 js中有三种表达方法
类方法,属性方法,原型方法
function People(name) {
this.name=name;
//对象方法
this.Introduce=function(){
console.log("My name is "+this.name);
}
}
//类方法
People.Run=function(){
console.log("I can run");
}
//原型方法
People.prototype.IntroduceChinese=function(){
console.log("我的名字是"+this.name);
}
//测试
var p1=new People("xx");
p1.Introduce(); // My name is xx
People.Run(); //I can run
p1.IntroduceChinese(); 我的名字是xx
其实从上面可以看出prototype,实际上向people中添加了一个方法,而这也应官方的解释“prototype 属性使您有能力向对象添加属性和方法"
2 实现继承
function baseClass(){
this.showMessage = function () {
console.log('baseClass:','woc this is bad boy')
}
}
// function extendClass(){}
function extendClass(){
this.showMessage = function () {
console.log('extendClass:', 'woc this is good body')
}
}
function extendClass1(){}
extendClass.prototype = new baseClass()
extendClass1.prototype = new baseClass()
var eC = new extendClass() //extendClass: woc this is good body
var eC1 = new extendClass1() //baseClass: woc this is bad boy
eC.showMessage()
eC1.showMessage()
从上面的案例可以看出如果extendClass()的showMessage存在的情况就会指向自己,如果不存在就会指向其”父类“
call() 和 appyl()
1 每个function中有一个prototype, call(), apply()
call() apply() 我简单的理解为改变你当前对象的指向,这可能有点抽象,看下代码
function method1(arg1, arg2) {
return arg1+arg2
}
function method2(arg1, arg2) {
return arg1-arg2
}
var result1 = method2.apply(method1,[3,2]);
var result2 = method1.call(method2,3,3)
console.log(result1); //1
console.log(result2); //6
从上面的实例可以看出两个function的指向发上了改变
call() apply(): 这个是当前的this指针指向调用你的那个function(有点类似copy的意思)
而两者的区别在于apply() 在参数上只有两个参数(当前方法,数组),
而call()的参数则是单个单个的形式
2 实现继承
function father(word) {
this.word = word
this.showName1 = function(){
console.log('Father say:', this.word)
}
}
function mother(word) {
this.word = word
this.showName2 = function () {
console.log('Mother say:', this.word)
}
}
function child(word) {
// father.apply(this,[word])
father.call(this, word)
mother.call(this, word)
}
var c = new child('boys');
c.showName1(); // Father say: boys
c.showName2(); // Mother say: boys
3 好的案例
(1)活用
var result = Math.max(7.25,7.30) var array = [1,3,4,5,6,0,32.3,3.3] var result1 = Math.max.apply(null,array);
var result2 = Math.min.apply(null,array);
console.log(result) // 7.3
console.log(result1) // 32.3
console.log(result2) // 0
在js Math.max()中的参数是没有传数组的形式的,而这里通过apply()巧妙地实现了这种转变,首先我们并不需要那个对象去指向Math,所以放了一个null做为参数,然后将arary数组传入其中
(2) 理解
function baseClass() {
this.showMsg = function()
{
console.log("baseClass::showMsg");
}
this.baseShowMsg = function()
{
console.log("baseClass::baseShowMsg");
}
}
baseClass.showMsg = function()
{
console.log("baseClass::showMsg static");
}
function extendClass()
{
this.showMsg =function ()
{
console.log("extendClass::showMsg");
}
}
extendClass.showMsg = function()
{
console.log("extendClass::showMsg static")
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg(); //显示extendClass::showMsg
instance.baseShowMsg(); //显示baseClass::baseShowMsg
instance.showMsg(); //显示extendClass::showMsg
baseClass.showMsg.call(instance);//显示baseClass::showMsg static
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);//显示baseClass::showMsg
js中call(),apply(),以及prototype的含义的更多相关文章
- 深入理解js中的apply、call、bind
概述 js中的apply,call都是为了改变某个函数运行时的上下文环境而存在的,即改变函数内部的this指向. apply() apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作 ...
- js中的apply和call API
借用网上的一个例子: fun.call(this,arg1,arg2,arg3) fun.apply(this,arguments) this.fun(arg1,arg2,arg3) 三种方法等效. ...
- Js中的apply和call
1.call和apply都是为了改变某个函数运行时的上下文而存在的 2.也就是改变函数体内this的指向. 3.二者的作用完全一样,只是接受参数的方式不太一样. 4.call 需要把参数按顺序传递进去 ...
- 分析js中的constructor 和prototype
在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...
- JavaScript中call,apply和prototype
[TOC] call()方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 如果没有提供 thi ...
- 深入分析js中的constructor 和prototype
在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...
- 关于JS中的constructor与prototype
======================================================================== 在学习JS的面向对象过程中,一直对constructo ...
- 【JavaScript】关于JS中的constructor与prototype
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
- 【推荐】关于JS中的constructor与prototype【转】
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
随机推荐
- 嵌入式C语言自我修养 07:地址对齐那些事儿
7.1 属性声明:aligned GNU C 通过 __atttribute__ 来声明 aligned 和 packed 属性,指定一个变量或类型的对齐方式.这两个属性用来告诉编译器:在给变量分配存 ...
- 使用aapt查看apk包名和启动的activity
执行命令: aapt dump badging F:\知乎.apk
- Leecode刷题之旅-C语言/python-389 找不同
/* * @lc app=leetcode.cn id=389 lang=c * * [389] 找不同 * * https://leetcode-cn.com/problems/find-the-d ...
- IDEA的基本配置
一.安装 常规下载安装,换路径即可. 亲测可用破解方法:进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.P ...
- 20155224聂小益的Linux学习
20155224聂小益的虚拟机安装 虚拟机安装 一开始,我在下载VirtulBox及Ubuntu遇到了一些困难,老实说点进去看到一大堆英文界面的时候真的是有点吓到.不过几秒钟之后就发现这并没有什么哈哈 ...
- 20145234黄斐《java程序设计》第二周
教材学习内容总结 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Type),其中类类型也叫参考类型(Reference Type). 字节类型,也叫byte类型, ...
- WPF MVVM从入门到精通3:数据绑定
原文:WPF MVVM从入门到精通3:数据绑定 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 WPF ...
- Spring MVC接受参数的注解
一.Request请求发出后,Headler Method是如何接收处理数据的? Headler Method绑定常用的参数注解,根据处理request的不同部分分为四类: A.处理 Request ...
- iOS 中架构模式的浅显理解
我们开发软件中应用各种模式,主要是为了 职责划分:一个类只做一件事 易用,可维护,方便扩展 解耦,相互独立,可单独测试 各种设计模式其实都是在解决上面的问题,让我们对比看看吧. 一.如何理解MVC设计 ...
- httpclient在获取response的entity时报异常
httpClient报异常:Premature end of chunk coded message body: closing chunk expected 首先这个异常提示直译过来就是:被编码信息 ...