js面向对象学习笔记

<span style="white-space:pre">	</span><script type="text/javascript">
<span style="white-space:pre">		</span>/*****  面向对象编程   *****/
<span style="white-space:pre">		</span>/** 工厂模式 **/
<span style="white-space:pre">		</span>function createPerson(name, age, job) {
<span style="white-space:pre">			</span>var o = new Object();
<span style="white-space:pre">			</span>o.name = this.name;
<span style="white-space:pre">			</span>o.age = this.age;
<span style="white-space:pre">			</span>o.job = this.job;
<span style="white-space:pre">			</span>o.sayName = function() {
<span style="white-space:pre">				</span>alert(this.name);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>return o;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>var person1 = createPerson('tom', 12, 'code');
<span style="white-space:pre">		</span>var person2 = createPerson('nick', 20, 'code1');


<span style="white-space:pre">		</span>/** 构造函数模式 **/
<span style="white-space:pre">		</span>function Person(name, age, job) {
<span style="white-space:pre">			</span>this.name = name;
<span style="white-space:pre">			</span>this.age = age;
<span style="white-space:pre">			</span>this.sayName = function () {
<span style="white-space:pre">				</span>alert(this.name);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>var person1 = new Person('tom', 20, 'ad');
<span style="white-space:pre">		</span>var person2 = new Person('nick', 30, 'db');


<span style="white-space:pre">		</span>function Person(name, age ,job) {
<span style="white-space:pre">			</span>this.name = name;
<span style="white-space:pre">			</span>this.age = age;
<span style="white-space:pre">			</span>this.job = job;
<span style="white-space:pre">			</span>//每次创建对象都会new 一个新的function对象
<span style="white-space:pre">			</span>this.sayName = new Function("alert(this.name)");
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>// 使用全局函数不符合类的封装
<span style="white-space:pre">		</span>function Person(name, age ,job) {
<span style="white-space:pre">			</span>this.name = name;
<span style="white-space:pre">			</span>this.age = age;
<span style="white-space:pre">			</span>this.job = job;
<span style="white-space:pre">			</span>this.sayName = sayName; //调用全局函数
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>function sayName() {
<span style="white-space:pre">			</span>alert(this.name);
<span style="white-space:pre">		</span>}




<span style="white-space:pre">		</span>/**  原型模式  **/
<span style="white-space:pre">		</span>function Person() {
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>Person.prototype.name = 'nick';
<span style="white-space:pre">		</span>Person.prototype.age = 20;
<span style="white-space:pre">		</span>Person.prototype.sayName = function () {
<span style="white-space:pre">			</span>alert(this.name);
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>var person1 = new Person();
<span style="white-space:pre">		</span>var person2 = new Person();
<span style="white-space:pre">		</span>person1.sayName();
<span style="white-space:pre">		</span>person2.sayName();
<span style="white-space:pre">		</span>alert(person1.sayName == person2.sayName);
<span style="white-space:pre">		</span>//获取所有可枚举属性数组
<span style="white-space:pre">		</span>Object.keys(Person.prototype); // [name,age,sayName];
<span style="white-space:pre">		</span>person1.name = 'tom';
<span style="white-space:pre">		</span>person1.age = 30;
<span style="white-space:pre">		</span>Object.keys(person1);//[name,age]
<span style="white-space:pre">		</span>//获得所有属性,无论是否可枚举
<span style="white-space:pre">		</span>Object.getOwnPropertyNames(Person.prototype);//[constructor,name,age,job,sayName]


<span style="white-space:pre">		</span>/** 验证实例属性属于原型对象而不属于实例 **/
<span style="white-space:pre">		</span>function hasPrototypeProperty(object, name) {
<span style="white-space:pre">			</span>// object.hasOwnProperty(name) 验证实例中是否有该属性,是:true,否,false
<span style="white-space:pre">			</span>// name in object 验证该属性是否属于该对象的原型对象属性或类属性
<span style="white-space:pre">			</span>return !object.hasOwnProperty(name) && (name in object);
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>/** 组合使用构造函数模式和原型模式 **/
<span style="white-space:pre">		</span>function Person(name, age, job) {
<span style="white-space:pre">			</span>this.name = name;
<span style="white-space:pre">			</span>this.age = age;
<span style="white-space:pre">			</span>this.job = job;
<span style="white-space:pre">			</span>this.friends = ['Shelby', 'courty'];
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>Person.prototype = {
<span style="white-space:pre">			</span>constructor: Person,
<span style="white-space:pre">			</span>sayName: function() {
<span style="white-space:pre">				</span>alert(this.name);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>var person1 = new Person('nick', 29, 'software engin');
<span style="white-space:pre">		</span>var person2 = new Person('tom', 30, 'fadsf');


<span style="white-space:pre">		</span>person1.friends.push('van');
<span style="white-space:pre">		</span>alert(person1.friends);//Shelby,courty,van
<span style="white-space:pre">		</span>alert(person2.friends);//Shelby,conrty
<span style="white-space:pre">		</span>alert(person1.friends == person2.friends); //false
<span style="white-space:pre">		</span>alert(person1.sayName == person2.sayName); //true


<span style="white-space:pre">		</span>/**  动态原型模式 **/
<span style="white-space:pre">		</span>function Person(name, age, job) {
<span style="white-space:pre">			</span>this.name = name;
<span style="white-space:pre">			</span>this.age = age;
<span style="white-space:pre">			</span>this.job = job;


<span style="white-space:pre">			</span>//先检查后初始化
<span style="white-space:pre">			</span>if (typeof this.sayName != "function") {
<span style="white-space:pre">				</span>Person.prototype.sayName = function() {
<span style="white-space:pre">					</span>alert(this.name);
<span style="white-space:pre">				</span>}
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>/** 寄生虫模式  **/
<span style="white-space:pre">		</span>function Person(name, age, job) {
<span style="white-space:pre">			</span>var o = new Object();
<span style="white-space:pre">			</span>o.name = name;
<span style="white-space:pre">			</span>o.age = age;
<span style="white-space:pre">			</span>o.job = job;
<span style="white-space:pre">			</span>o.sayName = function() {
<span style="white-space:pre">				</span>alert(this.name);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>return o;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>//例子
<span style="white-space:pre">		</span>function SpecialArray() {
<span style="white-space:pre">			</span>//创建数组
<span style="white-space:pre">			</span>var values = new Array();
<span style="white-space:pre">			</span>//添加值
<span style="white-space:pre">			</span>values.push.apply(values, arguments);
<span style="white-space:pre">			</span>//添加方法
<span style="white-space:pre">			</span>values.toPipedString = function() {
<span style="white-space:pre">				</span>return this.join("|");
<span style="white-space:pre">			</span>};
<span style="white-space:pre">			</span>//返回数组
<span style="white-space:pre">			</span>return values;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>var colors = new SpecialArray("red",'blue','green');
<span style="white-space:pre">		</span>alert(colors.toPipedString()); //"red|blue|green"


<span style="white-space:pre">		</span>/** 稳妥构造函数模式 **/
<span style="white-space:pre">		</span>//用于在安全环境中,或者防止数据被其它程序改动时使用
<span style="white-space:pre">		</span>function Person(name, age, job) {
<span style="white-space:pre">			</span>var o = new Object();
<span style="white-space:pre">			</span>o.sayName = function () {


<span style="white-space:pre">			</span>};
<span style="white-space:pre">			</span>return o;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>//除了使用sayName方法之外,没有其它办法访问name的值


<span style="white-space:pre">		</span>/****  继承  ****/
<span style="white-space:pre">		</span>/** 原型链 **/
<span style="white-space:pre">		</span>function SuperType() {
<span style="white-space:pre">			</span>this.property = true;
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>SuperType.prototype.getSuperValue = function() {
<span style="white-space:pre">			</span>return this.property;
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>function SubType() {
<span style="white-space:pre">			</span>this.subproperty = false;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>//继承了SuperType
<span style="white-space:pre">		</span>SubType.prototype = new SuperType();
<span style="white-space:pre">		</span>SubType.prototype.getSubValue = function() {
<span style="white-space:pre">			</span>return this.subproperty;
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>var instance = new SubType();
<span style="white-space:pre">		</span>alert(instance.getSuperValue()); //true


<span style="white-space:pre">		</span>/** 借用构造函数 **/
<span style="white-space:pre">		</span>function SuperType() {
<span style="white-space:pre">			</span>this.colors = ['red','blue','green'];
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>function SubType() {
<span style="white-space:pre">			</span>//继承SuperType
<span style="white-space:pre">			</span>SuperType.call(this);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>var instance1 = new SubType();
<span style="white-space:pre">		</span>instance1.colors.push('black');
<span style="white-space:pre">		</span>alert(instance1.colors); //'red,blue,green,black';
<span style="white-space:pre">		</span>var instance2 = new SubType();
<span style="white-space:pre">		</span>alert(instance2.colors); //'red,blue,green';
<span style="white-space:pre">		</span>//传递参数
<span style="white-space:pre">		</span>function SuperType(name) {
<span style="white-space:pre">			</span>this.name = name;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>function SubType() {
<span style="white-space:pre">			</span>//继承SuperType, 同时传递参数
<span style="white-space:pre">			</span>SuperType.call(this, 'Nicholas');


<span style="white-space:pre">			</span>//实例属性
<span style="white-space:pre">			</span>this.age = 29;
<span style="white-space:pre">		</span>}


<span style="white-space:pre">		</span>var instance = new SubType();
<span style="white-space:pre">		</span>alert(instance.name); //'Nicholas';
<span style="white-space:pre">		</span>alert(instance.age); //29


<span style="white-space:pre">		</span>/** 组合继承 **/
<span style="white-space:pre">		</span>function SuperType(name) {
<span style="white-space:pre">			</span>this.name = name;
<span style="white-space:pre">			</span>this.colors = ['red','blue','green'];
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>SuperType.prototype.sayName = function() {
<span style="white-space:pre">			</span>alert(this.name);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>function SubType(name, age) {
<span style="white-space:pre">			</span>//继承属性
<span style="white-space:pre">			</span>SuperType.call(this, name); //第二次调用SuperType
<span style="white-space:pre">			</span>this.age = age;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>SubType.prototype = new SuperType(); //第一次调用SuperType
<span style="white-space:pre">		</span>SubType.prototype.sayAge = function() {
<span style="white-space:pre">			</span>alert(this.age);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>var instance1 = new SubType('Nicholas', 29);
<span style="white-space:pre">		</span>instance1.colors.push('black');
<span style="white-space:pre">		</span>alert(instance1.colors); // 'red, blue, green, black';
<span style="white-space:pre">		</span>instance1.sayName(); //Nicholas;
<span style="white-space:pre">		</span>instance1.sayAge();//29
<span style="white-space:pre">		</span>var instance2 = new SubType('Gren', 27);
<span style="white-space:pre">		</span>alert(instance2.colors); //'red,blue,green';
<span style="white-space:pre">		</span>instance2.sayName(); // Gren
<span style="white-space:pre">		</span>instance2.sayAge(); //27
<span style="white-space:pre">		</span>// 在第一次调用SuperType构造函数时,SubType.prototype会得到两个属性:name和colors;她们都是SuperType的实例属性,
<span style="white-space:pre">		</span>//只不过现在位于SubType的原型中.当调用SubType的构造函数时,又条用了一
<span style="white-space:pre">		</span>//次SuperType构造函数,这一次又在新对象上创建了实例属性:name和colors。
<span style="white-space:pre">		</span>//于是这两个属性就屏蔽了原型中的同名属性




<span style="white-space:pre">		</span>/** 原型式继承 **/
<span style="white-space:pre">		</span>function object(o) {
<span style="white-space:pre">			</span>function F() {};
<span style="white-space:pre">			</span>F.prototype = o;
<span style="white-space:pre">			</span>return new F;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>var person = {
<span style="white-space:pre">			</span>name: 'tom',
<span style="white-space:pre">			</span>friends: ['shelby', 'court', 'van']
<span style="white-space:pre">		</span>};
<span style="white-space:pre">		</span>var anotherPerson = object(person);
<span style="white-space:pre">		</span>anotherPerson.name = 'Greg';
<span style="white-space:pre">		</span>anotherPerson.friends.push('Rob');


<span style="white-space:pre">		</span>var yetAnotherPerson = object(person);
<span style="white-space:pre">		</span>yetAnotherPerson.name = 'Linda';
<span style="white-space:pre">		</span>yetAnotherPerson.friends.push('Barbie');


<span style="white-space:pre">		</span>alert(person.friends); // shelby,court,van,Rob,Barbie


<span style="white-space:pre">		</span>/** 寄生式继承 **/
<span style="white-space:pre">		</span>function createAnother(original) {
<span style="white-space:pre">			</span>var clone = object(original); //通过调用函数创建一个新对象
<span style="white-space:pre">			</span>clone.sayHi = function() { //以某种方式来增强对象
<span style="white-space:pre">				</span>alert('Hi');
<span style="white-space:pre">			</span>};
<span style="white-space:pre">			</span>return clone;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>var person = {
<span style="white-space:pre">			</span>name: 'tom',
<span style="white-space:pre">			</span>friends: ['shelby', 'court', 'van']
<span style="white-space:pre">		</span>};
<span style="white-space:pre">		</span>var anotherPerson = createAnother(person);
<span style="white-space:pre">		</span>anotherPerson.sayHi(); //hi


<span style="white-space:pre">		</span>/** 寄生组合模式 **/
<span style="white-space:pre">		</span>function inheritPrototype(SubType, SuperType) {
<span style="white-space:pre">			</span>var prototype = object(SuperType.prototype); //创建对象
<span style="white-space:pre">			</span>prototype.constructor = SubType; //增强对象
<span style="white-space:pre">			</span>SubType.prototype = prototype;   //指定对象
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>function SuperType(name) {
<span style="white-space:pre">			</span>this.name = name;
<span style="white-space:pre">			</span>this.colors = ['red', 'blue', 'green'];
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>SuperType.prototype.sayName = function() {
<span style="white-space:pre">			</span>alert(this.name);
<span style="white-space:pre">		</span>};
<span style="white-space:pre">		</span>function SubType(name, age) {
<span style="white-space:pre">			</span>SuperType.call(this, name);
<span style="white-space:pre">			</span>this.age = age;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>inheritPrototype(SubType, SuperType);
<span style="white-space:pre">		</span>SubType.prototype.sayAge = function() {
<span style="white-space:pre">			</span>alert(this.age);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>//此模式的高效率体现在它只条用了一次SuperType的构造函数,并且因此避免了
<span style="white-space:pre">		</span>//在SubType.prototype上面创建不必要的。多余的属性。与此同时,原型链还
<span style="white-space:pre">		</span>//能保持不变;因此,还能够正常使用instanceof 和 isPrototypeOf()


<span style="white-space:pre">	</span></script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值