JavaScript原型&原型链& call / apply

原型定义: 原型是function对象的一个属性,他定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。 原型也是对象。

下面用一个原型的例子展示一下:

/*
所有new 出来的Person对象都有它的属性
相当于Person对象  继承自prototype的属性和方法
*/

Person.prototype = {
    LastName = "zhang",
    name = "ming",
    say = function () {
        console.log("hehe");
    }
}
function Person(name) {
    this.LastName = name;  // 会覆盖该对象继承自原型的东西

}
var p = new Person("aa");


/*
如果执行  
p.name = "sss";  不会修改原型的值  而是会在p对象内加一个name  属性

修改原型属性的正确姿势:
Person.prototype.name = "mingming";

不能通过delete删除对象原型属性  来删除 原型属性
delete p.prototype.name   不会动原型的
delete Person.prototype.name   这样会动原型的

*/

修改原型指向的对象:

// 一个个的原型串起来构成原型链
function Person() {
    /*
    var this = {


        __proto__ : Perosn.prototype
    }
    */

}

var obj = {};
var p = new Person();
p.__proto__ = obj; // 改遍原型


// 实例  依据原型链查找
Person.prototype = {
    name : "a",
    sayName : function () {
        console.log(this.name);
    }
}
function Perosn () {
    this.name = "b";
}

var person = new Person();
person.sayName(this.name); // 输出b    this指的是  person  
person.prototype.sayName(this.name); // 输出a  this指的是person.prototype

 

 

通过Object.creat()方法创建对象

var obj = {
    name : "zhang"
};

var obj1 = Object.creat(null);  // 创建一个没有prototype的对象
var obj1 = Object.creat(obj);  // 创建一个prototype是obj的对象

重写方法

Number.prototype.toString = function () {
    return "hehe";
}

var num = 123;
num.toString();

// 输出  hehe

取整方法

Math.ceil(123.333);   // 124   向上取整
Math.floor(123.999);   // 123  向下取整

call方法的使用

function Person (name, age) {
    this.name = name;
    this.age = age;
};

var obj = {
    
};

Person.call(obj, "zhang", 19);

====>>call生成
function Person (name, age) {
    obj.name = "zhang";
    obj.age = 19;
};

///  下面一个call   实例

function Person (name, age, sex) { 
    this.name = name;
    this.age = age;
    this.sex = sex;
}

function Student (name, age, sex, tel, grade) {
    Person.call(this, name, age, sex);
    this.tel = tel;
    this.grade = grade;
}

var stu = new Student("ming", 19, male, 110, 100);

开发中call 常用的场景

// call的使用
// 轮子生产车间
function Wheel(wheelSize, style) {
    this.wheelSize = wheelSize;
    this.style = style;
}
// 样式设计车间
function Sit(sitColor) {
    this.sitColor = sitColor;
}
// 框架生产车间
function Model(height, width, len) {
    this.height = height;
    this.width = width;
    this.len = len;
}
// 汽车组装车间
function Car(wheelSize, style, sitColor, height, width, len) {
    Wheel.call(this, wheelSize, style);
    Sit.call(this, sitColor);
    Model.call(this, height, width, len);
}

var car = new Car(100, "花里胡哨", "red", 1000, 1500, 5000);

与call  稍微不同的是

call需要把实参按照形参的方式传

apply 需要传一个arguments   即如下

function Person(name, age) {
    this.name = name;
    this.age = age;
}
var obj1 = {};

var person = Person.apply(obj1, ["zhang", 19]);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值