1,最常见的面向对象创建
2,对象字面量写法----
以上两者缺点,一个接口,无法复用、继承,一个对象只能用一次
3、工厂模式:无法解决对象识别的问题,不知道他的标示,类型,
4、每定义一个函数就是实例化一个对象,对象就是函数,函数就是对象
5、所以以上还是没有解决的一个,实例化了两个一样功能的函数-也就是一样的方法的东西,故封装性行非常差---oop思想,继承封装多态
以下开始原形继承的问题:
每一个函数都有一个prototype属性,指向一个对象,作为共有方法来共享的实例、对象---同时,构造出来的实例对象也获得一个相应的construction属性,指向构造函数
因此可以不必共有的属性和方法,放到构造函数定义中,
原型链---定义:通过调用构造函数生成的实例对象的的原型对象,---1说明原型对象和实例有关系,2构造函数和原型有关系3construction指向一个包含prototype属性所在的函数的指针
使用hasOwnPrototype()可以检查一个属性是存在于实例中还是原型中,实例时给出true,结合in这个可以重写一个函数来去定于他存在哪里
function hasPrototypePreperty(object,name){
return !object.hasOwnProperty(name) && (name in objecct);
//如是原型最后一定是false,true && true 那就是原型属性,
如果是true,实例,false&&true == false 实例属性
}
此举解决的过多的代码实例问题---性能问题--节省内存
最后为了视觉上的封装原型对象,用对象字面量(只写一边的东西,最简洁,最合适):
function Person(){};
Person.prototype = {
construction:Person,//这个值很重要,一定要记得设置
name: "",
age:29,
sayName : function(){
alert(this.name);
}
}
实例和原型是松散的关系,重写会切断最初原型和构造函数的关系,实例指针仅仅指向原型而不指向构造函数
但是原型对象定义出现了一个问题就是参数的传递的问题,除此之外还有属性相通的问题,既为解决属性共有的问题,也出现了属性共有的问题,这真是一个问题的两面性啊
所有出现了混合构造函数模式和原型构造模式
但是还是为了视觉上的封装特性,使用动态原型模式更为必要
他把所有信息封装在构造函数中,尽在有必要情况下初始化原型保持了同时使用构造函数和原型的优点
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
//方法
if(typeof this.sayName != 'function'){
Preson.prototype.sayName = function(){
alert(this.name);
}
}
}//其中的方法代码--只在初次调用的时候执行一次,以后不会执行了,不存在重新的问题
在sayName函数不存在的情况下,才会添加他到原型对象中
以下开始函数内部实现原理
1、变量的定义
2、什么是作用域
3、执行环境
4、上下文\解析