javascript面向对象

来源:互联网 发布:程序员上班3天被劝退 编辑:程序博客网 时间:2024/06/08 14:19

1.创建1个对象,然后给这个对象新建属性和方法

var box = new Object();//创建对象box.name='Lee';//添加属性box.age=100;box.run=function (){return this.name +this.age+'运行中...';//this表示当前作用域下的对象}console.log(box.run());var name = 'Jack';console.log(this.name);//这里的this代表的是window
2.关于对象的引用问题

//对象引用var box = new Object();//创建对象box.name='Lee';//添加属性box.age=100;box.run=function (){return this.name +this.age+'运行中...';//this表示当前作用域下的对象}console.log(box.run());var box2 = box;//box2引用boxbox2.name='Jack';//添加属性box2.age=200;box2.run=function (){return this.name +this.age+'运行中...';//this表示当前作用域下的对象}console.log(box.run());//对象相互引用造成了混淆console.log(box2.run());
3.为了解决多个类似对象声明的问题,可以使用工厂模式

//工厂模式function createObj(name,age){var obj = new Object();//创建对象obj.name = name;//添加属性obj.age = age;obj.run = function(){//添加方法return this.name+this.age+'运行中...';}return obj;//返回对象引用}var box = createObj('Lee',100);console.log(box.run());var box2 = createObj('Jack',200);console.log(box2.run());console.log(typeof box);//工厂模式解决了重复实例化的问题,但是存在识别问题,无法确定他们到底是哪个对象的实例console.log(box instanceof Object);
4.工厂模式解决了重复实例化的问题,但是存在识别的问题,无法确定他们到底是哪个对象的实例,可以使用构造函数解决这个问题

/ECMAScript中可以采用构造函数来创建特定的对象function Box(name,age){//创建一个对象,所有构造函数的对象其实就是Objectthis.name = name;//添加属性this.age = age;this.run = function(){//添加方法return this.name+this.age+'运行中....';}}//1.构造函数没有new Object,但他后台会自动var obj = new Object();//2.this就相当于obj//3.构造函数不需要返回对象引用,她是后台自动返回的//4.构造函数也是函数,但函数名第一个字母大写//5.必须new 构造函数名(),构造函数名第一个字母必须大写//6.必须使用new运算符var box1 = new Box('Lee',100);var box2 = new Box('Jack',200);console.log(box1.run());console.log(box2.run());console.log(typeof box1);console.log(box1 instanceof Box);//可以识别,box1是Box对象的引用//关于this的使用,this代表当前作用域对象的引用,如果在全局范围this就代表window对象,//如果在构造函数体内,就代表当前的构造函数所生命的对象var name = 'kkk';console.log(this.name);
5.探讨一下构造函数内部的方法问题,看看2个实例化后的属性或方法是否相等

function Box(name,age){//创建一个对象,所有构造函数的对象其实就是Objectthis.name = name;//添加属性this.age = age;this.run = function(){//添加方法return this.name+this.age+'运行中....';}}//console.log(Box('Lee',100));//undefined 构造函数用普通函数调用是无效的,必须使用new运算符var o = new Object();Box.call(o,'Lee',100);//对象冒充//console.log(o.run());var box1 = new Box('Lee',100);var box2 = new Box('Lee',100);console.log(box1.name==box2.name);//true 属性的值相等console.log(box1.age==box2.age);console.log(box1.run==box2.run);//false 方法其实也是一种引用地址console.log(box1.run()==box2.run());//true 方法的值相等,因为传参一致//加深理解,关于function是引用function Box(name,age){//new Function的唯一性this.name = name;//添加属性this.age = age;this.run = new Function("return this.name+this.age+'运行中....';");}var box1 = new Box('Lee',100);var box2 = new Box('Lee',100);console.log(box1.name==box2.name);//true 属性的值相等console.log(box1.age==box2.age);console.log(box1.run==box2.run);//false 方法其实也是一种引用地址console.log(box1.run()==box2.run());//true 方法的值相等,因为传参一致function Box(name,age){//创建一个对象,所有构造函数的对象其实就是Objectthis.name = name;//添加属性this.age = age;this.run = run;}function run(){//把构造函数内部的方法通过全局来实现引用地址一致return this.name+this.age+'运行中....';}var box1 = new Box('Lee',100);var box2 = new Box('Lee',100);console.log(box1.name==box2.name);//true 属性的值相等console.log(box1.age==box2.age);console.log(box1.run==box2.run);//true 方法其实也是一种引用地址console.log(box1.run()==box2.run());//true 方法的值相等,因为传参一致//通过使用全局函数保证了引用地址的一致性,但这种方法又带来了新的问题,//全局的this在对象调用时是Box本身,而当作普通函数调用的时候this又代表windowconsole.log(run());//出现了问题
上述面向对象基础是以后学习原型的基础,需要好好理解。






1 0
原创粉丝点击