JS的prototype、apply、call

1:原生链:prototype

  儿子能够继承父亲的属性,也可以觉得遗传基因不好自己改属性,(但是不能改变老爸的属性)。

看例子:

            function farther(){                    this.name = "jack",                    this.sex = "man",                    this.age = 18;                    this.cbo = function(){                        console.log(this.name);                    }                }//    继承                farther.prototype = {                    son:function(){                        this.name = "jack-two";//  使用自己的name和父类的sex                        console.log(this.name +"\t"+ this.sex);//    更改父类的方法。                                      this.cbo = function(){                            console.log("cbo change.");                        };                        this.cbo();                    }                }                new farther().cbo();    // 输出 jack                new farther().son();    // 输出jack 和 jack-two 加 man 加 cbo change.                new farther().cbo();    // 输出的值依然是 jack;子类不能更改父类属性  

2:call(list) 和 apply(arry) :

  用法1: 对象1.方法.call(对象2),

        对象1的方法使用对象2的属性,

  用法2: 对象1.call(对象2); 对象2.对象1的方法,

        在对象2中使用对象1的方法。

用法不一样,效果是一样的,一个缺少方法,一个缺少属性。

  为什么要把 call 和 apply 放一起呢?因为他们除了参数,其效果是一样的。

            function NameShowing(sex, age) {                this.showName = function() {                    console.log(this.name + "\t" + sex + "\t" + age);                }            }            function Person(name) {                this.yourCC = function(){                    console.log(name)                }                this.name = name;            };//    实例化对象            var nameShowing = new NameShowing();            var jeremy = new Person("Jeremy")//替换this指向 jeremy            NameShowing.apply(jeremy, ["girl",18]);            jeremy.showName();//    当然可以利用 call(this) 来联合2个对象                        function cExent(name,sex,age) {                NameShowing.call(this,sex,age);                Person.call(this,name);            }//    这会执行fobj            var c2 = new cExent("jack","man",18);//    调用NameShowing的myName方法                        c2.showName();                    c2.yourCC("my name is jack");    // 输出 jack,因为实例化的时候用的是jack
时间: 2024-12-20 07:00:01

JS的prototype、apply、call的相关文章

js: this,call,apply,bind 总结

对js中的一些基本的很重要的概念做一些总结,对进一步学习js很重. 一.this JavaScript 中的 this 总是指向一个对象,而具体指向那个对象是在运行时基于函数的执行环境动态绑定的,而非函数声明时的环境     实际应用中 this 的指向大致可以分为以下 4 中:         1. 作为对象的方法调用         2. 作为普通函数掉用         3. 构造器调用         4. Function.prototype.call 或 Function.proto

js 的 call apply bind 方法

js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) thisObj可选项.将被用作当前对象的对象.arg1, arg2, argN ..可选项.将被传递方法参数序列. 如果没设置严格模式 “use strict” 当thisObj 不存在或 为 undefined 或为 null 或为 this 时,则隐式地指向 全局对象(在浏览器中即为 wi

js的prototype扩展的一个例子,模仿C#的StringBuilder功能,数组组合字符串,效率大于+拼凑

function StringBuilder() { this._strings_ = new Array;}StringBuilder.prototype.append = function (str) { this._strings_.push(str);};StringBuilder.prototype.toString = function () { return this._strings_.join("");}; js的prototype扩展的一个例子,模仿C#的Strin

js:深入prototype(上:内存分析)

/** * 以下演示了通过原型的创建方式,使用基于原型的创建可以将属性和方法 * 设置为Person专有的,不能通过window来调用. * 原型是javascript中的一个特殊对象,当一个函数创建之后,会随之就产生一个原型对象 * 当通过这个这个函数的构造函数创建了一个具体的对象之后,在这个具体的对象中,就会有一个属性指向原型 */ //第一种状态 function Person(){                        } //第二种状态 Person.prototype.nam

js:深入prototype(下:原型重写)

//当属性和方法特别多时,编写起来不是很方便,可以通过json的格式来编写 //由于原型重写,而且没有通过Person.prototype来指定,此时的constructor不会再指向Person而是指向Object //如果constructor真的比较重要,可以在json中说明原型的指向 function Person(){ } Person.prototype = { //constructor:Person,   //手动指定constructor name:"octopus"

深入理解js的prototype以及prototype的一些应用

上一篇讲了js的prototype概念,在这里回顾一下prototype的定义: prototype是函数的一个属性,并且是函数的原型对象.引用它的必然是函数,这个应该记住. 但是,很奇怪,各位看官,你有没有看过类似下面这样引用prototype的js代码: function func(){ var args = Array.prototype.slice.call(arguments, 1); return args; } 咦???看着上面这行代码,你是不是对prototype只是属于函数产生

js call 和apply

ECMAScript3  给Function原型上定义了两个方法,他们是Function.prototype.call和Function.prototype.apply. call和apply的区别 1 var func =function(a,b,c){ 2 alert([a,b,c]); 3 }; 4 func.apply(null,[1,2,3]);//apply 5 6 7 var func =function(a,b,c){ 8 alert([a,b,c]); 9 }; 10 func

JS的prototype和__proto__、constructor

看了JS的prototype和__proto__这篇文章,才感觉很清晰了,对于原型这块,以前经常把这些属性弄不清楚, 明白了之后保存下整理下: prototype: 是函数的一个属性(每个函数都有一个prototype属性) __proto__: 是一个对象拥有的内置属性 (prototype是函数的内置属性,__proto__是对象的内置属性) 二.new 的过程 var t= function(){}; var p = new t(); new的过程拆分成以下三步:(1) var p={};

Js中Prototype、__proto__、Constructor、Object、Function关系介绍

Js中Prototype.__proto__.Constructor.Object.Function关系介绍 一    Prototype.__proto__与Object.Function关系介绍        Function.Object:Js自带的函数对象. prototype,每一个函数对象都有一个显示的prototype属性,它代表了对象的原型(Function.prototype函数对象是个例外,没有prototype属性). __proto__:每个对象都有一个名为__proto

Function.prototype.apply.call

我们先从一道简单的题目开始,前几天在git上看到的: 定义log方法,它可以代理console.log的方法.log(1,2,3)  =>  1 2 3 通常,你的答案会是这样的: function log(){ var args = Array.prototype.slice.call(arguments); console.log.apply(console, args); }; 直到有一天,你看到一个非常高大上的答案: function log(){ Function.prototype.