JavaScript

prototype:

其实对象直接通过 【object.属性/方法】  来定义方法和属性也是可以的,但是会变成静态属性和静态方法,也就是调用的时候也是通过“.”来调用的。
但如果通过prototype来定义,那么是不行的,必须先实例化属性才可以调用
另外也不一定必须用prototype来定义实例方法和实例属性,可以在函数体中

var aa = function()
{
    //使用【this.属性/方法】来定义。    
}


call

1、【方法.call(另一个方法,参数1,参数2,参数3…)】
这种就是单纯的替换和传递参数的作用

var add = function(a,b)
{
    alert("我是add");
    alert(a + b);
}

var sub = function(a,b)
{
    alert("我是sub");
    alert(a -  b);
}

add.call(sub,3,1); //这个例子的意思是将add替换sub,所以结果是4

2、【object.call】直接通过对象进行call操作是继承的意思

【Animal.call(this,name);】说明Animal代替了所有的Cat,也就是说Cat对象目前可以调用Animal中所有的对象和属性,谁叫他被代替了

var Animal = function(name)
{
    this.name  = name;
    this.showName = function()
    {
        alert(this.name);
    }
}

var Cat = function(name)
{ 
    alert("123");
    Animal.call(this,name);    
}

var cat = new Cat("cat"); //对象创建时,自动执行函数内的代码块

cat.showName();

前者代替/传承后者,后者继承前者。然后执行操作前者的函数

【object.方法.call(另一个对象,参数1,参数2,参数3…)】
call的作用是将【object.方法】在【另一个对象】的【函数体】中执行,并且传入参数。有点继承和委托

var Cat = function()
{
    this.name  = "cat";
}

var animal = new Animal();
var cat = new Cat();

animal.showName.call(cat,"HelloWorld");




原文地址:https://www.cnblogs.com/CyLee/p/5324623.html