/*
在进行自定义构造函数创建对象之前,我们首先了解一下构造函数和普通函数有什么区别。
其一,实际上并不存在创建构造函数的特殊语法,其与普通函数唯一的区别在于调用方法。对于任意函数,使用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共享了该全局函数,解决了内存浪费的问题。
但是,通过全局函数的方式解决对象内部共享的问题,终究不像一个好的解决方法。如果这样定义的全局函数多了,我们想要将自定义对象封装的初衷便几乎无法实现了。更好的方案是通过原型对象模式来解决。*/
在进行自定义构造函数创建对象之前,我们首先了解一下构造函数和普通函数有什么区别。
其一,实际上并不存在创建构造函数的特殊语法,其与普通函数唯一的区别在于调用方法。对于任意函数,使用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共享了该全局函数,解决了内存浪费的问题。
但是,通过全局函数的方式解决对象内部共享的问题,终究不像一个好的解决方法。如果这样定义的全局函数多了,我们想要将自定义对象封装的初衷便几乎无法实现了。更好的方案是通过原型对象模式来解决。*/