javascript面向对象基础

//工厂模式
//解决了重复实例化,但是有识别问题
function createObject(name, age){
    var obj = new Object();                        //创建对象
    obj.name = name;                            //添加属性
    obj.age = age;
    obj.run = function(){                        //添加方法
        return this.name + this.age + ‘运行中...‘;
    };
    return obj;                                    //返回对象引用
}

var box = createObject(‘Lee‘, 100);                //创建对象
var box1 = createObject(‘Jack‘, 200);

alert(box.run());                                //打印对象方法
alert(box1.run());

//*************************************************构造函数
//解决了重复实例化,解决识别问题,改良后的工厂方法
function Box(name, age){        //创建对象
    this.name = name;            //添加属性
    this.age = age;
    this.run = function(){
        return this.name + this.age + ‘运行中...‘;
    };
}

function Desk(name, age){        //创建对象
    this.name = name;            //添加属性
    this.age = age;
    this.run = function(){
        return this.name + this.age + ‘运行中...‘;
    };
}

//1.构造函数没有new Object,但是后台会自动var obj = new Object();
//2.this就相当于obj
//3.构造函数不需要返回对象引用,后台自动返回

//规范1.构造函数也是函数,但函数名第一个字母要大写
//2.必须new 构造函数名(),new Box(),而且这个Box第一个字母也是大写的
//3.必须使用new运算符

var box = new Box(‘Lee‘, 100);            //实例化
var box1 = new Box(‘Jack‘, 200);
var box2 = new Desk(‘kkk‘, 300);

// alert(box.run());                        //打印对象方法
// alert(box1.run());

console.log(box instanceof Box);
console.log(box1 instanceof Box);
console.log(box2 instanceof Box);        //可以识别
console.log(box2 instanceof Desk);    

//*************************************************对象冒充
function Box(name, age){        //创建对象
    this.name = name;            //添加属性
    this.age = age;
    this.run = function(){
        return this.name + this.age + ‘运行中...‘;
    };
}

var o = new Object();
Box.call(o, ‘Lee‘, ‘100‘);        //对象冒充
alert(o.run());

//**************************************************引用地址一致性,不好
//外部函数解决,不好
function Box(name, age){        //创建对象
    this.name = name;            //添加属性
    this.age = age;
    this.run = run;
}

function run(){            //把构造函数内部方法通过全局来保证引用地址一致性
    return this.name + this.age + ‘运行中...‘;
}

var box = new Box(‘Lee‘, 100);
var box1 = new Box(‘Lee‘, 100);
// alert(box.name == box1.name);
// alert(box.age == box1.age);
// alert(box.run() == box1.run());
// alert(box.run);                    //方法的引用地址
alert(box.run == box1.run);            //因为比较他们实例化地址

alert(run());

//**************************************************原型模式方式,引用地址一致,好
function Box(){}    //构造函数函数体内什么都没有,这里如果有,叫做实例属性,实例方法

Box.prototype.name = ‘Lee‘;                //原型属性        __proto__
Box.prototype.age = 100;
Box.prototype.run = function(){            //属性方法
    return this.name + this.age + ‘运行中...‘;
}

var box = new Box();
box.name = ‘Jack‘;    //实例属性,并没有重写原型属性
console.log(box.name);        //就近原则,先查找实例属性和方法,没有在去找原型属性和方法
// console.log(box.hasOwnProperty(‘name‘));    //判断是否是实例属性

delete box.name;
console.log(box.name);
// delete Box.prototype.name;
// Box.prototype.name = ‘kkk‘;
alert(‘name‘ in box);        //实例或原型都有就返回true

var box1 = new Box();
// console.log(box1.name);        //实例属性不会共享,所以box1访问不到box的实例属性

alert(isProperty(box1, ‘name‘));

// console.log(box.age);
// console.log(box.run());

// console.log(box.run == box1.run);          //true

// console.log(box.prototype);                //实例访问不到prototype,这个属性是对象,访问不到
// console.log(box.__proto__);                //这个属性是指针,指向prototype圆形对象,ie不支持打印
//console.log(Box.prototype);                //使用对象名访问prototype

// console.log(box.constructor);                //构造属性,可以获取构造函数本身Box()
//                                     //作用是被原型指针定位,然后得到构造函数本事
//                                     //其实就是 对象实例 对应的 原型对象 的作用

// console.log(box1.name);

//判断依个对象实例(对象引用)是否指向原型对象,基本上,只要实例化了,自动指向
// console.log(Box.prototype.isPrototypeOf(box));

// var obj = new Object();
// console.log(Box.prototype.isPrototypeOf(obj));

function isProperty(object, proterty){
    return !object.hasOwnProperty(proterty) && (proterty in object);

}

//***************************************************
//字面量的方式创建原型对象,这里的{}就是对象,而且是Object, new Object() = {}
function Box(){};

Box.prototype = {
    constructor : Box,            //强制指向Box
    name : ‘Lee‘,
    age : 100,
    run : function(){
        return this.name + this.age + ‘运行中...‘;
    }
};

// var box = new Box();
// console.log(box.constructor);            //Object

Box.prototype = {
    age : 200            //这里不会保留之前原型的任何信息,
}                        //把原来的原型对象和构造函数对象实例之前的关系切断了

var box = new Box();
console.log(box.name);
// var box = [2,34,5,2,3,6,7,4,75];

// console.log(box.sort());

//查看sort是否是Array原型对象里的方法
// alert(Array.prototype.sort);
// alert(String.prototype.substring);

//内置引用类型的功能扩展
String.prototype.addstring = function(){
    return this + ‘被添加的...‘;
}

var box = ‘Lee‘;
alert(box.addstring());

function Box(){};

Box.prototype = {
    constructor : Box,            //强制指向Box
    name : ‘Lee‘,
    age : 100,
    family : [‘哥哥‘, ‘姐姐‘, ‘妹妹‘],
    run : function(){
        return this.name + this.age + ‘运行中...‘;
    }
};

var box = new Box();
alert(box.family);
box.family.push(‘弟弟‘);        //在第一个实例修改后引用类型,保持了共享
alert(box.family);

var box1 = new Box();
alert(box1.family);                //共享了box添加后引用类型的原型

//组合构造函数 + 原型模式

function Box(name, age){            //保持独立的用构造函数
    this.name = name;
    this.age = age;
    this.family = [‘哥哥‘, ‘姐姐‘, ‘妹妹‘];
}

Box.prototype = {                    //保持共享的用原型
    constructor : Box,
    run : function(){
        return this.name + this.age + ‘运行中...‘;
    }
}

var box = new Box(‘Lee‘, 100);
console.log(box.run());
alert(box.family);
box.family.push(‘弟弟‘);        //在第一个实例修改后引用类型,保持了共享
alert(box.family);

var box1 = new Box(‘Jack‘, 200);
console.log(box1.run());
alert(box1.family);                //引用类型没有使用原型,所以没有共享

//动态原型模式
function Box(name, age){            //保持独立的用构造函数
    this.name = name;
    this.age = age;
    this.family = [‘哥哥‘, ‘姐姐‘, ‘妹妹‘];

    if(typeof this.run != ‘function‘){        //判断this.run是否存在,初始化一次
        Box.prototype.run = function(){
            return this.name + this.age + ‘运行中...‘;
        }
    }
}

//原型初始化,只要第一次初始化就可以了,没必要每次构造函数实例化的时候都初始化

var box = new Box(‘Lee‘, 100);
console.log(box.run());

var box1 = new Box(‘Jack‘, 200);
console.log(box1.run());

//寄生构造函数 = 工厂模式 + 构造函数

function Box(name, age){
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.run = function(){
        return this.name + this.age + ‘运行中...‘;
    }
    return obj;
}

var box = new Box(‘Lee‘, 100);
console.log(box.run());

var box1 = new Box(‘Jack‘, 200);
console.log(box1.run());

//稳妥构造函数
function Box(name, age){
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.run = function(){
        return this.name + this.age + ‘运行中...‘;
    }
    return obj;
}

var box = Box(‘Lee‘, 100);
console.log(box.run());

//继承,通过原型链实现

function Box(){                //被继承的函数叫超类型(父类,基类)
    this.name = ‘Lee‘;
}

function Desk(){            //继承的函数叫做子类型(子类,派生类)
    this.age = 100;
}

function Table(){
    this.level = ‘AAAAA‘;
}

//超类型实例化后的对象实例,赋值给子类型的原型属性
//new Box()会将Box构造里的信息和原型里的信息都交给Desk
//Desk的原型,得到的是Box的构造+原型里的信息
Desk.prototype = new Box();
Table.prototype = new Desk();

var box = new Box();
alert(box.constructor);

var desk = new Desk();
console.log(desk.age);
console.log(desk.name);

var table = new Table();
console.log(table.name);
console.log(table.level);

function Box(){                //被继承的函数叫超类型(父类,基类)
    this.name = ‘Lee‘;
}

Box.prototype.name = ‘Jack‘;

function Desk(){            //继承的函数叫做子类型(子类,派生类)
    this.age = 100;
}

Desk.prototype = new Box();        

var box = new Box();
var desk = new Desk();
console.log(desk.name);        //就近原则,实例有就返回,没有就找原型

//子类型从属于自己或者他的超类型
console.log(desk instanceof Object);
console.log(desk instanceof Desk);
console.log(desk instanceof Box);
console.log(box instanceof Desk);

//对象冒充继承

function Box(name, age){
    this.name = name;
    this.age = age;
    // this.family = [‘哥哥‘, ‘姐姐‘, ‘妹妹‘];    //引用类型放在构造里就不会共享
}

Box.prototype.family = [‘哥哥‘, ‘姐姐‘, ‘妹妹‘];

function Desk(name, age){
    Box.call(this, name, age);        //对象冒充,只能继承构造里的信息
}

var desk = new Desk(‘Lee‘, 100);
console.log(desk.name);
console.log(desk.family);

function Box(name, age){
    this.name = name;
    this.age = age;
    this.family = [‘哥哥‘, ‘姐姐‘, ‘妹妹‘];    //引用类型放在构造里就不会共享
}

Box.prototype.run = function(){
    return this.name + this.age + ‘运行中...‘;
}

function Desk(name, age){
    Box.call(this, name, age);        //对象冒充,只能继承构造里的信息
}

var desk = new Desk(‘Lee‘, 100);
console.log(desk.name);
console.log(desk.family);
console.log(desk.run());        //继承不到prototype

var desk1 = new Desk(‘Lee‘, 100);

//组合继承 原型链 + 借用构造函数
//解决1构造传参,2原型链方法继承,3方法共享
function Box(name, age){
    this.name = name;
    this.age = age;
    this.family = [‘哥哥‘, ‘姐姐‘, ‘妹妹‘];    //引用类型放在构造里就不会共享
}

Box.prototype.run = function(){
    return this.name + this.age + ‘运行中...‘;
}

function Desk(name, age){
    Box.call(this, name, age);        //对象冒充,只能继承构造里的信息
}

Desk.prototype = new Box();            

var desk = new Desk(‘Lee‘, 100);
console.log(desk.name);
console.log(desk.family);
console.log(desk.run());        //继承不到prototype

var desk1 = new Desk(‘Lee‘, 100);

//原型式继承,问题:引用类型共享了

//临时中转函数
function obj(o){        //o表示将要传递进入的一个对象
    function F(){};        //F构造是一个临时新建的对象,用来存储传递过来的对象
    F.prototype = o;    //将o对象实例赋值给F构造的原型对象
    return new F();        //最后返回这个得到传递过来对象的对象实例
}

//F.prototype = 0 就相当于 Desk.prototype = new Box()

//这是字面量声明方式,相当于var box = new Box();
var box = {
    name : ‘Lee‘,
    age : 100,
    family : [‘哥哥‘, ‘姐姐‘, ‘妹妹‘]
};

//box1就等于new F();
var box = obj(box);
console.log(box.name);
console.log(box.family);
box.family.push(‘弟弟‘);
console.log(box.family);

var box1 = obj(box);
console.log(box.family);        //引用类型的属性共享了

//寄生式继承 = 原型式 + 工厂模式

//临时中转函数
function obj(o){
    function F(){}
    F.prototype = o;
    return new F();
}

//寄生函数
function create(o){
    var f = obj(o);
    f.run = function(){
        return this.name + ‘方法...‘;
    }
    return f;
}

var box = {
    name : ‘Lee‘,
    age : 100,
    family : [‘哥哥‘, ‘姐姐‘, ‘妹妹‘]
};

var box = create(box);
console.log(box.run());

//寄生组合继承
//临时中转函数
function obj(o){
    function F(){}
    F.prototype = o;
    return new F();
}

//寄生函数
function create(box, desk){
    var f = obj(box.prototype);
    f.constructor = desk;            //调整原型构造指针
    desk.prototype = f;
}

function Box(name, age){
    this.name = name;
    this.age = age;

    if(typeof this.run != ‘function‘){        //判断this.run是否存在,初始化一次
        Box.prototype.run = function(){
            return this.name + this.age + ‘运行中...‘;
        }
    }
}

function Desk(name, age){
    Box.call(this, name, age);        //对象冒充
}

//通过寄生组合继承来实现继承
create(Box, Desk);                    //替代Desk.prototype = new Box();

var desk = new Desk(‘Lee‘, 100);
alert(desk.name);
console.log(desk.constructor);
alert(desk.run());
时间: 2024-11-06 11:49:45

javascript面向对象基础的相关文章

Javascript面向对象基础(二)

一: 用定义函数的方式定义类在面向对象的思想中,最核心的概念之一就是类.一个类表示了具有相似性质的一类事物的抽象,通过实例化一个类,可以获得属于该类的一个实例,即对象.在JavaScript中定义一个类的方法如下:function class1(){       //类成员的定义及构造函数}这里class1既是一个函数也是一个类.可以将它理解为类的构造函数,负责初始化工作. 二:使用new操作符获得一个类的实例new Date(); 表示创建一个日期对象,而Date就是表示日期的类,只是这个类是

javascript 面向对象基础 (1)

常见的创建对象的方式有3种: ① 声明变量的方式 var obj1 = { key1: "val1", key1: "val2", show: function () { console.log(this.key1) } } var array = [1, 2, 3]; 可以给 obj1 继续添加属性和方法,如: obj1.color = "red"; obj1.hideen = function () { console.log("a

javascript面向对象基础(1)

主题 ?   1)工厂模式 ?   2)new运算符 ?   3)构造函数 ?   4)原型prototype ?   5)面相对象和面相过程编程 ?   6)类和对象 ## 知识点 ##需求 ### 1.需求一:实现多个选项卡的 - 问题一:如何写?按照以前方式写 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name=

JavaScript 面向对象学习——1

公司项目采用Ext,结果本人发现入门不易!尤其是采用JavaScript编写面向对象程序,经常使用jQuery的知道,jQuery是面向函数编程的,所以很容易入门.然而,Ext是面向对象的,那么,当你想要自定义Ext组件的时候,或者使用Ext组件的时候就会很苦恼.所以,要先学习Javascript面向对象基础,其次查看Ext源代码. 这将是后期的学习路线,博客路线. 1 Javascript是基于原型(Prototype based)的面向对象的语言,Java语言,是基于类模式(Class ba

javascript的基础知识及面向对象和原型属性

自己总结一下javascript的基础知识,希望对大家有用,也希望大家来拍砖,毕竟是个人的理解啊 1.1 类型检查:typeof(验证数据类型是:string) var num = 123; console.log(typeof num); // 1.2 in 运算符 作用:判断指定属性是否存在于指定的对象中. 如果指定的属性存在于指定的对象中,则 in 运算符会返回 true. 语法: 属性 in 对象 返回值:true 或者 false 示例: var obj = { age: 18 };

Javascript的面向对象基础

今天学习了一些关于javascript面向对象的基础,之前在网上也陆续接触过一些,不过都感觉理解的不够透彻,所以今天做一个小结. 首先javascript的面向对象还要从何为对象说起,所谓对象可以看作是一个黑盒子,你并不清除它内部实现功能的原理,但是你只要了解它是如何使用的,并且能够用它自带的功能完成自己想要做的事情,基本上来说这就是面向对象的思想.其实面向对象的思想生活中随处可见,电视机,电冰箱,空调等等,都可以看作是对象,拿一般人来说,无需知道它们的工作原理,但只要按说明书去使用即可. 回归

JavaScript 面向对象开发知识基础总结

JavaScript 面向对象开发知识基础总结 最近看了两本书,书中有些内容对自己还是很新的,有些内容是之前自己理解不够深的,所以拿出来总结一下,这两本书的名字如下: JavaScript 面向对象精要 JavaScript 启示录 如果对于 JavaScript 面向对象编程理解不够深的话,第一本书还是强烈推荐的.第二本书比较适合初中级的开发者阅读.对各种知识点都有代码示例.内容中规中矩. 1.JavaScript 中的变量类型和类型检测 C#和Java等编程语言用栈存储原始类型,用堆存储引用

JavaScript继承基础讲解,原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承

说好的讲解JavaScript继承,可是迟迟到现在讲解.废话不多说,直接进入正题. 既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考<面向对象JS基础讲解,工厂模式.构造函数模式.原型模式.混合模式.动态原型模式>,接下来讲一般通过那些方法完成JavaScript的继承. 原型链 JavaScript中实现继承最简单的方式就是使用原型链,将子类型的原型指向父类型的实例即可,即“子类型.prototype = new 父类型();”,实现方法如下

再谈javascript面向对象编程

前言:虽有陈皓<Javascript 面向对象编程>珠玉在前,但是我还是忍不住再画蛇添足的补上一篇文章,主要是因为javascript这门语言魅力.另外这篇文章是一篇入门文章,我也是才开始学习Javascript,有一点心得,才想写一篇这样文章,文章中难免有错误的地方,还请各位不吝吐槽指正 吐槽Javascript 初次接触Javascript,这门语言的确会让很多正规军感到诸多的不适,这种不适来自于Javascript的语法的简练和不严谨,这种不适也 来自Javascript这个悲催的名称,