javascript面向对象和原型

/*
//工厂模式
function createObject(name,age){
    var obj = new Object();//新建一个对象
    obj.name=name;//新建对象的属性
    obj.age=age;
    obj.run=function(){//新建对象的方法
        return this.name+","+this.age+"...running.";
    }
    return obj;//返回新建的对象引用
}

var box1 = createObject("Carl",20);
var box2 = createObject("Zhang",25);
alert(box1.run());
alert(box2.run());

//构造函数
function Box(name,age){
    this.name=name;//新建对象的属性
    this.age=age;
    this.run=function(){//新建对象的方法
        return this.name+","+this.age+"...running.";
    }

}

var box1 = new Box("Carl",20);//对象实例化
var box2 = new Box("Zhang",25);
alert(box1.run());
alert(box2.run());
alert(box1 instanceof Object);

//构造函数
function box(name,age){
    this.name=name;//新建对象的属性
    this.age=age;
    this.run=function(){//新建对象的方法
        return this.name+","+this.age+"...running.";
    }

}

var box1 = new box("Carl",20);//对象实例化
var box2 = new box("Zhang",25);
alert(box1.run());
alert(box2.run());
alert(box1 instanceof Object);

//构造函数
function Box(name,age){
    this.name=name;//新建对象的属性
    this.age=age;
    this.run=function(){//新建对象的方法
        return this.name+","+this.age+"...running.";
    }

}

var o = new Object();
Box.call(o,"Carl",20);//call   对象冒充
alert(o.run())

//构造函数
function Box(name,age){
    this.name=name;//新建对象的属性
    this.age=age;
    this.run=new Function("return this.name+this.age+‘..running...‘");

}

var o = new Object();
Box.call(o,"Carl",20);//call   对象冒充
alert(o.run());

//构造函数
function Box(name){
    this.name=name;//实例属性
}
Box.prototype.name="Zhang";//原型属性
Box.prototype.age=25;//原型属性
Box.prototype.run=function(){//原型方法
    return this.name+","+this.age+"...running.";
}

//构造函数体内的叫实例属性,每次新建的对象,其实例属性所在地址都是不一样的
//prototype是一个引用,指向一个对象,通过prototype创建的属性,叫做原型属性,每次新建的对象的原型属性地址是一样的。

var box1 = new Box("Carl");//对象实例化
alert(box1.run());
alert(box1.constructor);//构造函数,返回构造函数本身
alert(box1.hasOwnProperty("name"));//判断实例属性中是否含有name属性
delete box1.name;//删除实例属性
alert("name" in box1); //true 判断是否存在于实例属性或者原型属性

//构造函数
function Box(name){
    this.name=name;//实例属性
}

Box.prototype={
    name:"Zhang",//原型属性
    age:25,//原型属性
    run:function(){//原型方法
        return this.name+","+this.age+"...running.";
    }
}
var box = new Box();
alert(box.constructor);//Ojbect

//构造函数
function Box(name){
    this.name=name;//实例属性
}

Box.prototype={
    constructor:Box,
    name:"Zhang",//原型属性
    age:25,//原型属性
    run:function(){//原型方法
        return this.name+","+this.age+"...running.";
    }
}
var box = new Box();
alert(box.constructor);//Box

//构造函数
function Box(name){
    this.name=name;//实例属性
}

Box.prototype={
    constructor:Box,
    name:"Zhang",//原型属性
    age:25,//原型属性
    run:function(){//原型方法
        return this.name+","+this.age+"...running.";
    }
}
//重写原型
Box.prototyp={
    name:"Zhang"
}

var box = new Box();
alert(box.run());//error

var box=[2,1,29,3,0,13];
alert(box.sort());
alert(Array.prototype.sort);//查看sort是否为Array的原型函数

alert(String.prototype.addstring);
String.prototype.addstring=function(){
    return this+"...我是扩展的方法";
}
alert("Test addstring".addstring());

//动态原型模式
//构造函数
function Box(name,age){
    this.name=name;//实例属性
    this.age=age;

    //将原型封装到构造函数中
    Box.prototype.run=function(){
        return this.name+this.age+"running...";
    }
}

var box1= new Box("Carl",10);
var box2= new Box("Zhang",20);
alert(box1.run());
alert(box2.run());

//构造函数
function Box(name,age){
    this.name=name;//实例属性
    this.age=age;

    //将原型封装到构造函数中
    if(typeof this.run!=‘function‘){//加上这段可以使得下面的原型只初始化一次
        alert("初始化开始");
        Box.prototype.run=function(){
            return this.name+this.age+"running...";
        }
        alert("初始化结束");

    }
}

var box1= new Box("Carl",10);
var box2= new Box("Zhang",20);

//继承,通过原型链实现
function Box(){   //继承的函数叫做超类(父类,基类)
    this.name="Carl";
}
function Desk(){   //继承的函数叫做子类型(子类,派生类)
    this.age=100;
}
//通过原型链继承,超类型实例化后的对象实例,赋值给子类型的原型属性
Desk.prototype=new Box();//new Box()会将Box构造里的信息和原型里的信息全都交给Desk

var desk = new Desk();
alert(desk.name);

*/

/*
//1.原型链继承 2.借用构造函数继承(对象冒充继承) 3.组合继承(结合前两种)

//4.原型式继承

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

box={
    name:"Carl",
    age:20,
    family:["哥哥","姐姐","弟弟"]
};

var box1 = obj(box);
alert(box1.family);
box1.family.push("妹妹");
alert(box1.family);

var box2 = obj(box);
alert(box2.family);

*/

//临时中转函数
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;
}

Box.prototype.run=function(){
    return this.name+this.age+" running...";

}

function Desk(name,age){
    Box.call(this,name,age); //对象冒充
}
//通过寄生组合继承来实现继承
create(Box,Desk);//这句话用来代替Desk.prototype=new Box();

var desk =new Desk("Carl",20);
alert(desk.run());
alert(desk.constructor);
alert(desk.constructor.prototype);
alert(desk.__proto__===desk.constructor.prototype);

备注:本文部分代码来自李炎辉老师的javascript教程

时间: 2024-08-24 04:34:41

javascript面向对象和原型的相关文章

第一百零九节,JavaScript面向对象与原型

JavaScript面向对象与原型 学习要点: 1.学习条件 2.创建对象 3.原型 4.继承 ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript没有类的概念,因此它的对象也与基于类的语言中的对象有所不同.   一.学习条件 在JavaScript视频课程第一节课,就已经声明过,JavaScript课程需要大量的基础.这里,我们再详细探讨一下: 1

JavaScript 面向对象 (prototype 原型模式)

一. JavaScript 设计思想 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时.但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力.比如,如果网页上有一栏"用户名"要求填写,浏览器就无法判断访问者是否真的填写了,只有让服务器端判断.如果没有填写,服务器端就返回错误,要求用户重新填写,这太浪费时间和服务器资源了. 因此,网景公司急需一种网页脚本语言,使得浏览器可以与网页互动.工程师_Brend

JavaScript面向对象与原型(一):构造函数

提到构造函数,我们并不陌生,在面向对象领域,构造函数已经是一个老生常谈的问题了.在JavaScript中再次学习,真的是有一种亲切的感觉. 一.简单回顾 构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载. C#构造函数(一个简单的小例子): <span style="font-size:14px;"

有关javaScript面向对象和原型笔记

javaScript是一种比較特殊的语言,ECMAScript中没有类的概念.跟其它面向对象的语言有一定的差别.它的对象也与基于类的语言中的对象有所不同,严格来说,javascript对象是一组没有特定顺序的值,对象的每一个属性或方法都有一个名字.而每一个名字都映射到一个值.每一个对象都是基于一个引用类型的创建的. 创建自己定义对象的最简单的方式就是创建一个Object的实例.然后再为其加入属性和方法,如: var box = new Object(); //创建对象 box.name1 = '

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 box1 = createObject('Lee', 100); //第一个实例var box2 = cr

JavaScript 面向对象与原型

ECMAScript有两种开发模式:1.函数式(过程化);2.面向对象(OOP); 一 创建对象1.普通的创建对象 ? 1 2 3 4 5 6 7 8 9 // 创建一个对象,然后给这个对象新的属性和方法;   var box = new Object();       // 创建一个Object对象;   box.name = 'lee';          // 创建一个name属性并赋值;   box.age = 100;   box.run = function(){        //

JavaScript面向对象和原型函数

对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!). 常用的几种对象创建模式 使用new关键字创建 最基础的对象创建方式,无非就是和其他多数语言一样说的一样:没对象,你new一个呀! var gf = new Object(); gf.name = "tangwei"; gf.bar = "c++"; gf.sayWhat = functio

快速理解JavaScript面向对象编程—原型继承

总的来说js语言就是门面向对象编程的语言,对象这个概念几乎贯穿了整个js的学习. 对象 创建对象两种方法:(若要生成对象实例必须调用构造函数) 1.var obj = {name:"jer" , age:12};(在js内部调用了预设的Object()构造函数) 访问:alert(obj.name);//"jer" alert(obj["name"]);//"jer" 2.var obj = new Object(); obj

javascript面向对象和原型————呱呱二号

面向对象 1.工厂模式 function createObject(name,age){ let obj = new Object(); this.name = name; this.age = age; return obj; } let objA = createObject('Tom',24); let objB = createObject('Jane',23); typeof ObjA; //Object typeof ObjB; //Object ObjA instanceof Ob