最近在做关于js的面向对象的编程题目,但是感觉思维混乱,无从下手,于是总结一些从书上看到的内容,理理思绪。
prototype
每一个函数都包含一个prototype属性,它指向了一个对象的应用,这个对象称为原型对象。每一个函数都包含不同的原型对象。当将函数用作构造函数的时候,新创建的对象会从原型对象上继承属性。
call()和apply()
我们可以将这两种方法看成是某个对象的方法,通过调用方法的形式来间接调用函数。这两个方法的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对他的引用。要想以对象A的方法来调用函数 f() 可以这样使用:
f.call(A);
f.apply(A);
在ECMAScript 5的严格模式中这两个方法的第一个实参都会变成this的值,那怕传入的实参是原始值,甚至null或者undefined。在非严格模式中,传入的null或者undefined都会被全局对象代替,而其他原始值则会被相应的包装对象所代替。
而call方法在第一个实参后所有的参数z都是要传入呆调用函数的值
而apply方法会把这些值全部放入一个数组中。
bind()
是在ECMAScript 5中新增的方法,主要作用就是将函数绑定至某个对象。当在函数F()上调用bind()方法并传入一个对象做参数,这个方法会返回一个新的函数。当以函数调用的方式调用新函数将会把原始的函数F()当做对象的方法来调用传入新函数的任何实参都将传入原始函数。
使用new方法调用构造函数生成实例时,new的工作流程大概如下:
1.分配一个新的空对象.
2.设置新对象的相关属性、方法,例如继承Robot.prototype上的各式方法、属性。注意,这里执行的并不是拷贝,而是类似于引用的方法,称为代理(比如Robot.prototype对象的属性发生变化时,由Robot生成的实例对象直接继承的相应属性也会变化)。
3.将这个新对象作为构造函数的执行上下文(其this引用指向这个新的对象),并执行构造函数.
4.返回这个对象到执行new Robot("bower")的位置,赋值给前面的变量名.
创建的构造函数,函数名第一个字母一定要大写,本菜在瞎编的时候由于没有大写耽误不少时间
总体来说是:
1.待处理的对象分类
2.分别建立构造函数
3.分别建立原型方法
4.调用方法获得结果