JavaScript对象 -构建

首先,在js里,对象是由函数构建而成的。

创建对象的几种模式

1.工厂模式

function person(name,age,job) {
    var o=new Object();
    o.age=age;
    o.name=name;
    o.job=job;
    o.sayname=function () {
        console.log(this.name);
    }
    return o;
}

var person1=person("1",1,"1");
person1.sayname();
//检测对象什么类型
console.log(person1 instanceof Object);//trueconsole.log(person1 instanceof person);//FALSE

工厂模式解决了创建多个相似对象的问题,但是不知道如何知道一个对象的类型。

2.构造函数模式

function person(name,age,job) {
    this.name=name;
    this.age=age;
    this.job=job;
    this.sayname=function () {
        console.log(this.name);
    }
}
var person1=new person("1",1,"1");
person1.sayname();
console.log(person1 instanceof Object);//检测对象什么类型console.log(person1 instanceof person);//都是true

  与工厂模式不同点:

1.没有显式创建对象

2.属性方法赋予给this对象

3.没有return语句

创建对象使用new时,调用构造函数会有一下几步

1.创建一个新对象

2.构造函数的作用域给新对象

3.执行构造函数的代码

3.返回新对象

任何函数,只要通过new来调用,那么他就可以作为构造函数,他的问题就是每个方法要在每个实例上重新构造一遍

上述sayname方法等同于下

this.sayname=new function("console.log(this.name)")

如果再新建对象person2

console.log(person1.sayname==person2.sayname) ;结果是FALSE

当然我们可以把这些函数放在外面,在构造函数内调用,但是这样就毫无封装性。3.

3.原型模式每个函数都有一个prototype属性
function person() {
}
person.prototype.name="1";
person.prototype.age=12;
person.prototype.sayname=function () {
    console.log(this.name);
}

var person1=new person();
person1.sayname();       //1
var person2=new person();
person2.sayname();       //1

好处:让所有实例共享他的属性和方法

如果实例添加一个新属性且新属性与原型中的属性重名,那么就在实例中创建该属性,该属性会屏蔽掉原型中的该属性。

function person() {
}
person.prototype.name="1";
person.prototype.age=12;
person.prototype.sayname=function () {
    console.log(this.name);
}

var person1=new person();
person1.name="2";
person1.sayname();
delete person1.name;//删除新添加的属性
person1.sayname();  //会显示原型里的属性

接下来是重点:

function person() {
}
person.prototype={
    name:"1",
    age:12,
    sayname:function () {
        console.log(this.name);
    }
}
var friend=new person();
console.log(friend instanceof Object);  //true
console.log(friend instanceof person);   //true
console.log(friend.constructor == person);  //false
console.log(friend.constructor == Object);//true

person.prototype.sayhi=function () {
    console.log("hi");
}
friend.sayhi(); //hi

instanceof  判断一个变量是不是属于一个变量的实例。

constructor 属性返回对创建此对象的数组函数的引用。

friend是person的一个实例

所以向person中添加 Protype时friend也可以引用。

原型的动态性:

function person() {
}
var friend=new person();
console.log(friend instanceof Object);  //true
console.log(friend instanceof person);   //true
console.log(friend.constructor == person);  //true
console.log(friend.constructor == Object);  //true
console.log(friend.constructor);  //【Function:person】
person.prototype={
    constructor:person,
    name:"1",
    age:12,
    sayname:function () {
        console.log(this.name);
    }
}
friend.sayname();//报错

当执行到最后一句时会报错,原因是我们重写了整个原型对象。

大致就是这个样子,person原本指向person Protype,在重写原型对象后指向了new person Protype,但是friend仍然指向原来的person Protype,所以出现错误。

原型模式的问题:

function person() {
}
person.prototype={
    constructor:person,
    friends:["a","b","c"]
}
var person1=new person();
var person2=new person();
person1.friends.push("d");
console.log(person1.friends);//【a,b,c,d】
console.log(person2.friends);//[a,b,c,d]

会发现person2的friends也会有d

针对包含引用类型值的属性:

原因就是这个样子,person1引用Protype,所以修改person1就修改了person2。

最常用的创建对象对象

--------------------组合使用构造函数模式和原型模式

因为构造函数模式new时会创建一个新对象,而原型模式就是用于定义方法和共享属性。

function person(name) {
    this.name=name;
    this.friends=[‘a‘]
}
person.prototype={
    constructor:person,
    sayname:function () {
        console.log(this.name);
    }
}
var person1=new person("1") ;
var person2=new person("2") ;
person1.friends.push("b");
console.log(person1.friends);
console.log(person2.friends);
console.log(person1.friends==person2.friends);
console.log(person1.sayname==person2.sayname);

  结果:

[ ‘a‘, ‘b‘ ]
[ ‘a‘ ]
false
true

到这相信大家对JS构建对象有了一定的了解了!

 
时间: 2024-12-24 22:46:29

JavaScript对象 -构建的相关文章

深入JavaScript对象创建的细节

最近深入学习javascript后,有个体会:面向对象的方式编程才是高效灵活的编程,也是现在唯一可以让代码更加健壮的编程方式.如果我们抛开那些玄乎的抽象出类等等思想,我自己对面向对象的从写程序的角度理解就是:复用和封装.复用具体就是让你尽量少写重复代码,封装就是将一些耦合度很高的逻辑放到一个程序块里,而且尽量让里面内容不受外界影响.最后的结论是:优秀的javascript代码都是面向对象的.定州市科技工业局 如何构建javascript对象?ECMA-262对对象的定义是:无序属性的集合,其属性

javascript对象创建及原型继承的研究

今天总结了下javascript关于原型继承和对象创建方面的东西,因为javascript的原型继承在使用传统面向对象语言开发的同学看来比较怪异,原型继承确实比传统OOP语言的继承理解和运用起来困难一些,当然个人觉得传统OOP的继承相对比较简单,因为中规中矩. 下面逐个的用示例说明javascript中对象创建方式,专业一点叫什么模式,主要有直接单个创建:工厂模式:提出方法类函数公用方式:构造函数模式:构造函数+原型方式:使用原型本质的方式构建(这种受过李站的<悟透javascript>一书的

ajax操作之操作 JavaScript 对象

通过请求获取充分格式化的HTML虽然很方便,但这也意味着必须在传输文本内容的同时也 传输很多HTML标签.有时候,我们希望能够尽量少传输一些数据,然后马上处理这些数据.在 这种情况,我们希望取得能够通过JavaScript进行遍历的数据结构.          使用jQueiy的选择符可以遍历和操作取得的HTML结构,但是还有一种JavaScript内置的数据 格式,既能减少数据传输量,也会减少编码量.1.取得JSON         前面我们曾经看到过,JavaScript对象是由一些“键-值

javascript 对象简单介绍(二)

JavaScript Array(数组) 对象数组对象的作用是:使用单独的变量名来存储一系列的值. 什么是数组?数组对象是使用单独的变量名来存储一系列的值.如果你有一组数据(例如:车名字),存在单独变量如下所示:var car1="Saab";var car2="Volvo";var car3="BMW";然而,如果你想从中找出某一辆车?并且不是3辆,而是300辆呢?这将不是一件容易的事!最好的方法就是用数组.数组可以用一个变量名存储所有的值,并

深入JavaScript对象(Object)与类(class),详细了解类、原型

JavaScript基于原型的对象机制 JavaScript原型上的哪些事 一.JavaScript基于原型的对象机制 JavaScript对象是基于原型的面向对象机制.在一定程度上js基于原型的对象机制依然维持了类的基本特征:抽象.封装.继承.多态.面向类的设计模式:实例化.继承.多态,这些无法直接对应到JavaScript的对象机制.与强类型语言的类相对应的是JavaScript的原型,所以,只能是基于原型来模拟实现类的设计模式. 为了便于理解,这里采用了Function构造函数及对象原型链

JavaScript 对象

JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... 此外,JavaScript 允许自定义对象. JavaScript 对象 JavaScript 提供多个内建对象,比如 String.Date.Array 等等. 对象只是带有属性和方法的特殊数据类型. 建 JavaScript 对象 通过 JavaScript,您能够定义并创建自己的对象. 创建新对象有两种不同的方法: 定义并创建对象的实例 使用函数来定义对象,然后创建新的对象实例

javascript对象简介

javascript对象可分为三大类: 1.javascript本地对象和内置对象 2.浏览器对象(BOM) 3.文档对象(DOM) 一:javascript内置对象 1.Array(数组对象) 2.Number(数字对象) 3.String(字符串对象) 4.Boolean(布尔对象) 5.Math(数学对象) 6.RegExp(正则对象) 7.Date(日期时间对象) 二:浏览器对象(BOM) 1.Window对象: 2.Screen对象:可以获取屏幕的信息 3.Navigator:可以获取

JavaScript对象--------------你又知道那些

今天我和大家带来的是JavaScript对象的一些属性和函数(方法),通过这些了解,我们又能做出那些页面效果呢,下面就来进行今天的主题. 1.完整的JavaScript是由ECMAScript.BOM(浏览器对象模型)和DOM(文档对象模型)构成的.示意图如下: 而window对象是整个BOM的核心,Window对象是客户端javascript最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的网页,当遇到BODY,FRAMESET或FRAME元素时,都会自动建立window对象的实例.

javascript对象的一点理解

<script type="text/javascript"> /* js对象:对象的职责是调用属性和调用方法 */ //1.对象的创建的三种方式 var obj = {}; //常用且不会浪费空间 var obj = new Object(); //var obj = Object.create(); /* 第三种方式测试的时候有问题,百度下,发现 Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象. 参数: prototype 必需. 要用作