类(对象)的定义 自定义对象构造函数

对象创建和继承

对象创建指的是自定义对象构造函数,用于批量创建拥有共同属性方法的对象。例如创建一个人对象构造函数,然后实例化出小明,小红

继承指的是两个引用类型对象间属性和方法的继承,原理是利用prototype,因为实例内部保留了对构造函数prototype的指针,prototype保留对该构造函数的指针。所以如果把构造函数的prototype指向另一个对象类型实例的话,那么也就继承了该实例对构造函数prototype的指针以及它对构造函数的指针。

1、最古老的工厂模式,就是在里面新建对象,然后配置属性,返回这个对象,问题是无法判断对象类型(用不了instanceof):

function createPerson(name, age, job){

var o = new Object();

o.name = name;

o.age = age;

o.job = job;

o.sayName = function(){

alert(this.name);

};

return o;

}

var person1 = createPerson(“Nicholas”, 29, “Software Engineer”);

var person2 = createPerson(“Greg”, 27, “Doctor”);

2、构造函数模式,可以用instanceof来判断了,问题是每个实例都会创建相同的方法,没用公用:

function Person(name, age, job){

this.name = name;

this.age = age;

this.job = job;

this.sayName = function(){

alert(this.name);

};

}

var person1 = new Person(“Nicholas”, 29, “Software Engineer”);

var person2 = new Person(“Greg”, 27, “Doctor”);

当函数被一个  new  调用时,函数的运行方式就改变了, 把 new 看作是一个方法的话,类似下面:

Function.method(‘new‘, function () {              
    var that = Object.create(this.prototype);                                 // Create a new object that inherits from the  constructor‘s prototype.                                   
    var other = this.apply(that, arguments);                                // Invoke the constructor, binding –this- to  the new object.
    return (typeof other === ‘object‘ && other) || that;            // If its return value isn‘t an object,  substitute the new object.
});

忘记 new 的话,this  指向的是 全局变量,要避免这个问题,就加多一层检测(scope-safe):

function Car(sColor) {

if(this instanceof Car ) {
        this.color = sColor;

}else {

return new  Car(sColor);

}

}

这样做的问题是关闭了可以调用构造函数的上下文:

function Polygon(sides){

if (this instanceof Polygon) {

this.sides = sides;

this.getArea = function(){

return 0;

};

} else {

return new Polygon(sides);

}

}

function Rectangle(width, height){

Polygon.call(this, 2);                        //这里的调用Polygon返回一个新的Polygon实例,因此this没有被扩张

this.width = width;

this.height = height;

this.getArea = function(){

return this.width * this.height;

};

}

Rectangle.prototype = new Polygon();              //如果没有这句就会得不到2,而是undefined

var rect = new Rectangle(5, 10);

alert(rect.sides); //2

3、prototype 模式,问题是所有属性都公用了,而且还不能传递初始化的值:

function Person(){}

Person.prototype.name = “Nicholas”;

Person.prototype.age = 29;

Person.prototype.job = “Software Engineer”;

Person.prototype.sayName = function(){

alert(this.name);

};

var person1 = new Person();

person1.sayName();                                       //”Nicholas”

var person2 = new Person();

person2.sayName();                                        //”Nicholas”

alert(person1.sayName == person2.sayName);           //true

4、混合构造函数模式和prototype模式,取各自优点:

function Person(name, age, job){

this.name = name;

this.age = age;

this.job = job;

this.friends = [“Shelby”, “Court”];

}

Person.prototype = {

constructor: Person,

sayName : function () {

alert(this.name);

}

};

5、Dynamic Prototype Pattern:

function Person(name, age, job){

this.name = name;

this.age = age;

this.job = job;

if (typeof this.sayName != “function”) {

Person.prototype.sayName = function() {

alert(this.name);

};

}

}

var friend = new Person(“Nicholas”, 29, “Software Engineer”);

6、Parasitic Constructor Pattern:

function SpecialArray(){

var values = new Array();

values.push.apply(values, arguments);

values.toPipedString = function(){

return this.join(“|”);

};

return values;

}

var colors = new SpecialArray(“red”, “blue”, “green”);

alert(colors.toPipedString()); //”red|blue|green”

7、Durable Constructor Pattern,这种模式实例和构造函数原型没关系,无法使用instanceof:

function Person(name, age, job){

//create the object to return

var o = new Object();

//optional: define private variables/functions here

//attach methods

o.sayName = function(){

alert(name);

};

//return the object

return o;

}

var friend = Person(“Nicholas”, 29, “Software Engineer”);

friend.sayName(); //”Nicholas”

时间: 2025-01-03 22:58:12

类(对象)的定义 自定义对象构造函数的相关文章

IO流17 --- 对象流操作自定义对象 --- 技术搬运工(尚硅谷)

序列化 @Test public void test14() throws IOException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object1.dat")); oos.writeObject(new Person("张三", 20)); oos.close(); } 反序列化 @Test public void test15() throws IOEx

jQuery基础(常用插件 表单验证,图片放大镜,自定义对象级,jQuery UI,面板折叠)

1.表单验证插件--validate   该插件自带包含必填.数字.URL在内容的验证规则,即时显示异常信息,此外,还允许自定义验证规则,插件调用方法如下: $(form).validate({options}) 其中form参数表示表单元素名称,options参数表示调用方法时的配置对象,所有的验证规则和异常信息显示的位置都在该对象中进行设置.     2.表单插件--form 通过表单form插件,调用ajaxForm()方法,实现ajax方式向服务器提交表单数据,并通过方法中的option

JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype

一)函数 A)JS中的函数的定义格式: function add(a,b) { var sum = a+b; document.write("两个数的和是:" + sum); //return sum; } 上面只是一个例子 ,那么当我们再定义一个同名的函数会怎么样呢? function add(a,b,c) { var sum = a+b+c; document.write("三个数的和是:" + sum); } 然后调用函数: add(50,30,10);   

10 js自定义对象

引入 很多时候,我们是没办法预知要获取什么样的数据的,所以我们没办法一开始就写好一个类用来存储对应的数据,这个时候我们就需要使用自定义对象的知识了. Object类 与java 中一样,js中的根类也是Object类,我们创建自定义对象时,直接newObject了类的实例就可以了. var obj = new Object(); 然后再使用obj来接收各种数据: obj.data1 = "xxx"; obj.date2 = "xxxx"; 酱紫. 同样也可以添加函数

JavaScript 本地对象、内置对象、宿主对象

首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. 1.本地对象 ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”. 再来看一下,“本地对象”包含哪些内容: Object.Function.Array.String.Boolean.Number.Date.RegExp.Erro

C++基础 对象的管理——单个对象的管理

1. 为什么要有构造函数和析构函数 面向对象的思想是从生活中来,手机.车出厂时,是一样的. 这些对象都是被初始化后才上市的,初始化是对象普遍存在的一个状态. 普通方案: 对每个类提供一个 init 函数,对象创建后立即调用 init 函数进行初始化. 这种方案麻烦,并且不易用于对象数组. 所以需要构造函数,对应需要析构函数. 2. 对象的构造 (1)构造函数的定义 C++类可以定义与类名相同的特殊成员函数,此函数为构造函数. 构造函数在定时可以有参数,但无任何返回类型声明. (2)构造函数的调用

JS内置对象-String对象、Date日期对象、Array数组对象、Math对象

一.JavaScript中的所有事物都是对象:字符串.数组.数值.函数... 1.每个对象带有属性和方法 JavaScript允许自定义对象 2.自定义对象 a.定义并创建对象实例 b.使用函数来定义对象,然后创建新的对象实例 二.JS内置对象-String 1.string对象 string对象用于处理已有的字符串 字符串可以使用单引号或者双引号 2.indexOf( )  在字符串中查找字符串,如果匹配成功返回首字母所在的位置,否则返回-1 3.match() 匹配成功,返回匹配成功的数组,

JavaScript 类的定义和引用 JavaScript高级培训 自定义对象

在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascript中,已经存在一些标准的类,例如Date.Array.RegExp.String.Math.Number等等,这为我们编程提供了许多方

关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法

类的定义与对象的实例化操作 <?php //类里面的成员是属于对象的class Hero{    public $name;//成员变量    //成员属性(存在于强类型语言中)    protected $blood;    private $attack;    //成员方法    function skill(){        echo "$this->name<br>control";            }} $s = new Hero();//造