最近段时间主要学习前端去了,然而所遇到的一些问题我觉得有必要去深究一下

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的含义的更多相关文章

  1. 深入理解js中的apply、call、bind

    概述 js中的apply,call都是为了改变某个函数运行时的上下文环境而存在的,即改变函数内部的this指向. apply() apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作 ...

  2. js中的apply和call API

    借用网上的一个例子: fun.call(this,arg1,arg2,arg3) fun.apply(this,arguments) this.fun(arg1,arg2,arg3) 三种方法等效. ...

  3. Js中的apply和call

    1.call和apply都是为了改变某个函数运行时的上下文而存在的 2.也就是改变函数体内this的指向. 3.二者的作用完全一样,只是接受参数的方式不太一样. 4.call 需要把参数按顺序传递进去 ...

  4. 分析js中的constructor 和prototype

    在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...

  5. JavaScript中call,apply和prototype

    [TOC] call()方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 如果没有提供 thi ...

  6. 深入分析js中的constructor 和prototype

    在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要. 我们在定义函数的时候,函数定义的时候函 ...

  7. 关于JS中的constructor与prototype

    ======================================================================== 在学习JS的面向对象过程中,一直对constructo ...

  8. 【JavaScript】关于JS中的constructor与prototype

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

  9. 【推荐】关于JS中的constructor与prototype【转】

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

随机推荐

  1. 数据采集与分析的那些事——从数据埋点到AB测试

    作者:网易有数郑栋. 一.为什么企业需要一套完善的用户行为埋点和分析平台 产品初创期间,需要分析天使用户的行为来改进产品,甚至从用户行为中得到新的思路或发现来调整产品方向:产品成长过程,通过对用户行为 ...

  2. 基于STM32的简易数码相册

    原理:在板子上插入SD卡,并使用FATFS文件系统来循环读取并显示SD卡内的指定目录内的所有BMP图片. 这是显示效果(能上传视频的话就能看到循环显示效果): 因为图片显示函数显示的是24位BMP图片 ...

  3. MySQL数据库删除数据(有外键约束)

    在MySQL中删除一张表或一条数据的时候,出现有外键约束的问题,于是就去查了下方法: SELECT @@FOREIGN_KEY_CHECKS; 查询当前外键约束是否打开 ; 设置为1的时候外键约束是打 ...

  4. sourcetree的安装及使用

    sourcetree下载地址:https://www.sourcetreeapp.com/ 点击安装包安装 此前需要跳转到bitbucket登录,我没有账号,所以我直接跳转到到https://bitb ...

  5. SSM(Spring5.x+Mybatis3)框架搭建【解决日志问题】(Github源码)

    闲来无事,用SSM写个小东西,发现spring已经迭代到5.x了,遂出此文,希望对各位同学有些许帮助. IDE:idea OS:windows 源代码:https://github.com/JHeav ...

  6. HTML页面参数的传递与获取

    传递的页面: $("#btn").click(function () { window.location.href="diancan.html?a=1"; }) ...

  7. 推荐一个学习Flex chart的好网站

    推荐一个学习Flex chart的好网站 2013-03-04 14:16:56|  分类: Flex |  标签: |字号大中小 订阅     推荐一个学习Flex chart的好网站 最近在做一个 ...

  8. RHCE-EXAM 模拟题目

    真实考试环境说明: 你考试所用的真实物理机器会使用普通账号自动登陆,登陆后,桌面会有两个虚拟主机图标,分别是system1和system2.所有的考试操作都是在system1和system2上完成.S ...

  9. Luogu2183【国家集训队】礼物

    题面 题解 易得答案为 $$ \sum_{i=1}^m\binom{n-\sum_{j=1}^{i-1}w_j}{\sum_{j=1}^iw_j} $$ 扩展$\text{Lucas}$即可 代码 # ...

  10. javaweb(二十)——JavaBean总结

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...