当我们在使用js时往往要自己封装一些属性和方法到某对象中作为一个工具来优化我们的代码,同时我们也可以通过函数构造方法来工厂化某类对象
function getPerson(name, age, sex) { this.name = name; this.age = age; this.sex = sex; #对象方法 this.getInfo = function(explode) { return this.name + explode + this.age + explode + this.sex; } }
上面的函数便可以作为一个函数对象构造器去生成一个对象,不过这里要注意,在我们调用时一定要 new 一下才会生成一个新的对象,如果像函数一样直接调用的话那可就差十万八千里了
# new方法使用函数构造出一个新的对象 赋予对象的方法和属性 var xiaoMing = new getPerson('Xiao ming', 25, 'male'); console.log(xiaoMing); console.log(xiaoMing.name); console.log(xiaoMing.age); console.log(xiaoMing.sex); console.log(xiaoMing.getInfo('--'));
直接调用时构造函数里的this则代表了当前的默认全局对象 window
var winObj = getPerson('window', '--', 'unkown'); console.log(winObj); //打印出来的肯定是window对象啦
是的,当你new构造函数(引用类型)时会产生一个新的对象实例,当你直接调用函数时里面的this默认为当前的window
反正我是混淆了很长时间,主要是平日里 js 的类(对象构造函数,准确的说叫做引用类型,Object Date Array String 这些并不是对象,而是类型,同面向对象中的类相似,严格称作 “引用类型”)和 对象 与 我们接触到的编程语言中的有些...我不主攻前端,所以说了什么不专业的还请各位不要见怪
这里我把 Date Array Math这些叫做引用类型(你调用时就是个构造函数 new Date()),new 出来的叫对象实例
可以对现有的类进行方法扩展 实例化或自定义的对象是没有这一特性的
类的方法有
对象方法 : 在类的构造函数里用 this.Func = function() {} 实现的 会赋予对象
原型方法 : 在类外部使用 className.prototype.Func = function() {}实现的 会赋予对象 用于对现有类型的扩展
类方法: className.func = function() {} 实现的 不会赋予对象 只能本类访问 所以这货没办法用来做扩展
#原型方法 getPerson.prototype.getName = function() { retrun this.name; } #类方法 getPerson.getAge = function() { alert("对象无法继承,只能通过类访问") } var obj = new getPerson("sallency", 25, "male"); console.log(obj.getName());//sallency console.log(obj.getAge());//error 类方法是不能被对象继承的 #判断某类有没有某原型方法 注意这里是用prototype去访问构造原型方法 切勿与类方法混淆 #判断某原型方法是否存在 即 new 时对象能获得到的方法 if (!getPerson.prototype.getSex) { getPerson.property.getSex= function() { return this.sex; } }
#扩展顶级类Object if (!Object.prototype.getMsg) { //或者 Object.prototype.getMsg == undefined //typeof Object.prototype.getMsg == 'undefined' Object.prototype.getMsg = function() { alert("this is my prototype method: getMsg!"); } } #其他类都是从Object继承来的(原型链) 所以肯定也能访问到此原型 var arr = new Array(); arr.getMsg();
注意区别 对象/原型方法 和 类方法
var obj = new getPerson("sallency", 25, "male"); console.log(obj.hasOwnProperty('name')); //true console.log(obj.hasOwnProperty('age')); //true console.log(obj.hasOwnProperty('sex')); //true console.log(obj.hasOwnProperty('getName')); //true console.log(obj.hasOwnProperty('getAge')); //false 类方法无法被对象继承 只有对象和原型方法能被继承