(2020-12-04)JS高级部分杂谈

  • 创建对象的方法

创建对象的工厂模式:

function createObj(){
            var obj = new Object();
            obj.name = name;
            obj.age = age;
            return obj;
}

优点:可以大批量创建对象;

缺点:一种数据类型;

var man1 = createObj('小明',20);

构造函数创建对象:

function person(name,age,action,food){
         this.name = name;
         this.age = age;
         this.action = action;
         this.work
}

存放对象的方法(放到构造函数的原型中):

var personMethod = {
    eat:function(){
        document.write('</br>'+this.name+'喜欢吃'+this.food);
    },
    study:function(){
        ...
    }

}

优点:创建实例对象很方便,直接使用new运算符即可;方法存放在构造函数的原型对象中,实现方法共享,随用随调。

拓展

构造函数:所有的对象都有一个constructor属性,该属性的取值就是生成该对象的构造函数。

原型(prototype):所有的函数都是对象,每个函数对象都有个属性prototype,该属性的取值也一个对象,而且该对象也是该函数的实例。

可以通过设置prototype对象的方法和属性,每个实例可以共享这些属性和方法。

  • 原型和原型链

prototype

每个函数都有一个prototype属性

每一个javascript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型‘继承’属性。

function Person(){


}
//prototype是函数才会有的属性
Personprototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name)// Kevin
console.log(person2.name)// Kevin

proto

每一个javascript对象(除了null)都具有的一个属性,叫proto,这个属性会指向该对象的原型

function Person(){



}
var person = new Person();
console.log(person._proto_=== Person.prototype);// true

constructor

每个原型都有一个constructor属性指向关联的构造函数 实例原型指向构造函数

function Person(){



}
console.log(Person === Person.prototype.constructor);// true

原型与原型

var obj = new object();
obj.name = 'Kevin'
console.log(obj.name) // Kevin

原型链

console.log(object.prototype._proto_ === null) // true

小结:

javascript默认并不会复制对象的属性,相反,javascript只是在两个对象之间创建一个关联,

这样,一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,委托的说法反而更准确些。

函数高级用法:

普通函数:

function 函数名(函数名){}

函数表达式:

var 变量名 = function(参数){} // 匿名函数

构造函数:

new 构造函数(){}

this:

函数内this指向不同场景,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁实际上this的最终指向的是那个调用它的对象。

tips:在含有return的函数中,如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。

function fn(){
    this.user = '追梦人'
    return{};
}
var a = new fn;
console.log(a.user); // undefined

 

function fn(){
    this.user = '追梦人'
    return undefined
}
var a = new fn;  
console.log(a.user); //追梦人

小结:

还有一点就是虽然null也是对象,但是在这里this还是指向那个函数的实例,因为null比较特殊。

function fn()  
{  
    this.user = '追梦子';  
    return null;
}
var a = new fn;  
console.log(a.user); //追梦子

call:

借用其他对象的方法

语法:

被借用对象.方法.call(借用对象,参数列表);

apply:

借用其他对象的方法(注:传参时遍历数组,一一赋给被调用方法的参数)

语法:

被借用对象.方法.apply(借用对象,【参数列表】);

bind:

复制其他对象的方法(注:bind会生成新对象,需要返回)

语法:

被复制对象.方法.bind(借用对象,参数列表);

小结:

三者之间差距很小,call,bind,apply这三个函数的第一个参数都是this的指向对象,第二个参数的差别就来了。

call的参数是直接放进去的,第二第三第n个参数用逗号隔开,直接放入后面括号。

apply的所有参数都必须放在一个数组里面传进去。

bind除了返回函数以外,它的参数和call一样。

三者的参数也不限定是字符串类型,允许是各种类型,包括函数,对象等。

举例:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值