面向对象与原型02

/*
在进行自定义构造函数创建对象之前,我们首先了解一下构造函数和普通函数有什么区别。


其一,实际上并不存在创建构造函数的特殊语法,其与普通函数唯一的区别在于调用方法。对于任意函数,使用new操作符调用,那么它就是构造函数;不使用new操作符调用,那么它就是普通函数。


其二,按照惯例,我们约定构造函数名以大写字母开头,普通函数以小写字母开头,这样有利于显性区分二者。例如上面的new Array(),new Object()。


其三,使用new操作符调用构造函数时,会经历(1)创建一个新对象;(2)将构造函数作用域赋给新对象(使this指向该新对象);(3)执行构造函数代码;(4)返回新对象;4个阶段。
*/
//构造函数的方法创建对象 用构造函数创建特定对象
function Box(name,age){
this.name = 'zhao'; //所有构造函数的对象其实就是Object
this.age = 23;
this.run =run;
}
var box1 = new Box('zhao',100);  //实例化一个对象 引用地址为1
var box2 = new Box('jd',200);//实例化一个对象  引用地址为2
console.log(box1);
console.log(box2); 
function run(){
return this.name + this.age+'运行中...';
} //把构造函数内部方法放在外部 ,会有一些问题 如果这样定义的全局函数多了,我们想要将自定义对象封装的初衷便几乎无法实现了。更好的方案是通过原型对象模式来解决。 有可能会被恶意调用
//使用全局的函数run()来解决了地主的一致性
alert(box1.run == box2.run); //把构造函数内部的方法 通过全局来实现的话 保持引用地址一致



//构造函数没用new Object 但他的后台会自动 var obj = new Object
//this就相当于obj
//构造函数不需要返回对象引用 他是后台自动返回

/*面向对象 编程  构造函数里面基本不变化 外面实例化调用
我们在创建对象(执行alertName函数之前)时,就将alertName()函数绑定在了该对象上。我们完全可以在执行该函数的时候再这样做,办法是将对象方法移到构造函数外部:


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


function alertName() {
  alert(this.name);
}


var stu1 = new Student("easy1", 20);
var stu2 = new Student("easy2", 20);
在调用stu1.alert()时,this对象才被绑定到stu1上。


我们通过将alertName()函数定义为全局函数,这样对象中的alertName属性则被设置为指向该全局函数的指针。由此stu1和stu2共享了该全局函数,解决了内存浪费的问题。


但是,通过全局函数的方式解决对象内部共享的问题,终究不像一个好的解决方法。如果这样定义的全局函数多了,我们想要将自定义对象封装的初衷便几乎无法实现了。更好的方案是通过原型对象模式来解决。*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值