关于 js 对象

news/2024/7/3 13:30:05

js中所有事物都是对象:字符串 数组...()万物皆对象

js 有一些内建对象 String Date Array等

属性类型
  [[Configurable]] 表示能否通过 delete 删除属性从而从新定义属性,能否修改属性的特性
  [[Enumerable]] 表示能否通过 for-in 循环返回属性
  [[Writable]] 表示能否修改属性的值。
  [[Value]] 包含这个属性的数据值,默认为 undefined

不建议操作以上属性。

创建对象:

方式一:工厂模式

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("N", 29, "Engineer");
var person2 = createPerson("G", 27, "Doctor");

缺点:无法显示出 person1与 createPerson的依赖关系 (person1.constructor 等于 Object 构造函数)

方式二:构造函数模式

function Person(name, age, job){  //构造函数始终都应该以一个大写字母开头,非构造函数则以小写字母开头
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayName = function(){
      alert(this.name);
  };
}
var person1 = new Person("N", 29, "Engineer");
var person2 = new Person("G", 27, "Doctor");

以这种方式调用构造函数实际上会经历4个步骤
  1.创建一个新对象
  2.将构造函数的作用域赋给新对象 (实际上就是 构造函数中的 this );
  3.执行构造函数中的代码(添加属性)
    4.返回新对象

通过构造函数模式创建的对象都有一个 constructor 属性 该属性指向 Person

alert(person1.constructor == Person); //true

方式三:原型模式

  使用构造函数的prototype 属性来指定那些应该共享的属性和方法。 组合使用构造函数模式和原型模式时,使用构造函数定义实例属性,而使用原型定义共享的属性和方法。

每一个 通过构造函数 new 出来的实例 都包含一个内部属性,该属性仅指向 Person.prototype

function Person(){} //构造函数

Person.prototype.name = 'xx';
Person.prototype.age = 23;

var p1 = new Person();
p1.name = 'pp';
console.log(p1.name);  // pp  来自实例
delete p1.name;   // deleate  不能删除原型链上的属性  删除的是 实例上的属性
console.log(p1.name)  // xx   来自原型

  访问属性或方法时 总是先查找当前实例 当当前实例找不到所要的方法或者属性后再向上查找原型链上的方法与属性。所以,第一处打印会来自实例的name 属性 当删除改属性后(deleate不能删除原型上的属性),在当前实例找不到name属性 向上查找原型链上的name 属性,所以第二处打印的是 xx。

注意:in操作符会在通过对象能够访问给定属性时返回 true 无论该属性存在于实例中还是原型中(即只要实例或者原型中有要访问的属性即返回true)

解决办法:同时使用 hasOwnProperty() 跟 in 操作符,就可以确定该属性到底是存在于对象还是存在于原型

function hasPrototypeProperty(object,name){  //实例属性返回 false  原型属性 返回 true
  return !object.hasOwnProperty(name) && (name in object);
}

要取得对象上的所有可枚举的实例属性,可以使用 ES5的 Object.keys() 该方法接收一个对象作为参数

 

转载于:https://www.cnblogs.com/Shin-Huai/p/6020477.html


http://www.niftyadmin.cn/n/1536538.html

相关文章

vc多线程编程

VC中多线程使用比较广泛而且实用,在网上看到的教程.感觉写的挺好.一、问题的提出编写一个耗时的单线程程序:  新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND&#xf…

[完整版]Postgresql 数据库 备份以及恢复的过程

0. 准备工作 linux机器上面 必须安装上pg数据库 然后 需要将 pg的主程序目录 放到环境变量里面去 便于执行命令. 1. 先备份 1. 备份目标数据库: pg_dump -h 10.24.193.25 -U postgres -p 5432 -F c -f /TestPG/TestDS0816.dmp TestDS0816 # -h 小写 指向目标服务器 # -U 大写…

Java多线程-线程的同步与锁

一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据。 package cn.thread;public class Foo {private int x 100;public in…

C++随机数的用法

学过别的高级语言的都知道,产生随机数用的都是类似于random这样的字符,c也不例外,在C中使用的是rand()函数,但是不同的是,如果在C中只使用了例如 "int i;irand();"这样,使用程序会发现每次得到的随机数都是一…

​2023年湖北黄冈安管三类人员个人可以报名吗 ?报名时间是什么时候?

2023年湖北黄冈安管三类人员个人可以报名吗 ?报名时间是什么时候? 个人不可以报名。安管三类人员包括建筑施工企业主要负责人、建筑施工企业项目负责人以及建筑施工企业专职安全生产管理人员,他们是对本企业安全生产工作负责的三类人员&#…

PostgreSQL 修改设置数据库的默认用户以及权限.

1. 登录PG数据库. psql -U postgres 界面效果为: [rootcentos76 ~]# psql -U postgres psql (10.7) Type "help" for help.postgres# 其实这里面有一个主意事项. psql 的 命令执行 其实是在环境变量里面的 我这边使用的是rpm 方式安装的pg 数据库. 2. 简单说一下pg…

(转载)C/C++排序算法

排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。 对于排序的算法我想先做一点简单的介绍&…

ESXi 虚拟机 提示 无法打开本地虚拟机的 xxx.vmx 的本地管道的 问题解决.

1. 今天同事与我联系, 说一个虚拟机出现连不上, vcenter控制台关闭虚拟机之后 再次打开报错: 2. 自己最开始的解决方法 移除虚拟机, 进入服务器的datastore 重新注册, 结果发现问题更加严重, 虚拟机直接无法使用了. 3. 问题解决的方法与思路来源. 3.0 重新注册之后 有这么个提示…