《JS高程》对象&原型学习笔记
- // 当作构造函数使用
- var person = new Person("Nick", 29, "Software Engineer");
- person.sayName(); //"Nick"
- // 作为普通函数调用
- Person("Greg", 27, "Doctor");
- window.sayName(); //"Greg"
- //在另一个对象的作用域中调用
- var o = new Object();
- Person.call(o, "Kristen", 25, "Nurse");
- o.sayName(); //"Kristen"
构造函数的主要问题:每个方法都要在实例上重新创建一遍,因为 ECMAScript 中的函数是对象,因此每定义一个函数,也就实例化了一个对象。

- alert(Person.prototype.isPrototypeOf(person1)); //true
- alert(Person.prototype.isPrototypeOf(person2)); //true
- alert(Object.getPrototypeOf(person1) === Person.prototype); //true
- alert(Object.getPrototypeOf(person1).name); //"Nicholas"
- var person1 = new Person();
- var person2 = new Person();
- alert(person1.hasOwnProperty("name")); //false
- person1.name = "Greg";
- alert(person1.name); //"Greg"——来自实例
- alert(person1.hasOwnProperty("name")); //true
- alert(person2.name); //"Nicholas"——来自原型
- alert(person2.hasOwnProperty("name")); //false
- delete person1.name;
- alert(person1.name); //"Nicholas"——来自原型
- alert(person1.hasOwnProperty("name")); //false
ECMAScript 5 的 Object.getOwnPropertyDescriptor() 方法只能用于实例属性,要取得原型属性的描述符,必须直接在原型对象上调用 Object.getOwnPropertyDescriptor() 方法。
- alert(person1.hasOwnProperty("name")); //false;
- alert("name" in person1); //true
- person1.name = "Greg";
- alert(person1.name); //"Greg"——来自实例
- alert(person1.hasOwnProperty("name")); //true
- alert("name" in person1); //true;
- alert(person2.name); //"Nicholas"——来自原型
- alert(person2.hasOwnProperty("name")); //false
- alert("name" in person2); //true;
- delete person1.name;
- alert(person1.name); //"Nicholas"——来自原型
- alert(person1.hasOwnProperty("name")); //false
- alert("name" in person1); //true;
- function hasPrototypeProperty ( object, name ) {
- return !object.hasOwnProperty ( name ) && ( name in object );
- }
- function Person(){
- }
- Person.prototype = {
- constructor : Person,
- name : "Nicholas",
- age : 29,
- job : "Software Engineer",
- sayName : function () {
- alert(this.name);
- }
- };
注意:以这种方式重设 constructor 属性会导致它的 [[Enumerable]] 特性被设置为 true。默认情况下,原生的 constructor 属性是不可枚举的。
- 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);
- }
- }
- var person1 = new Person("Nicholas", 29, "Software Enginner");
- var person2 = new Person("Greg", 27, "Doctor");
- person1.friends.push("Van");
- alert(person1.friends); //"Shelby, Court, Van"
- alert(person2.friends); //"Shelby, Court"
- alert(person1.friends === person2.friends); //false
- alert(person1.sayName === person2.sayName); //true
A Plain English Guide to JavaScript Prototypes
《JS高程》对象&原型学习笔记的更多相关文章
- 《JS高程》事件学习笔记
事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...
- 《JS高程》数据类型学习笔记
认认真真看完了<JavaScript高级程序设计>第3章的基本概念,原来一直不明白的知识点都在这里面啊...T_T...基础真的很重要,很重要,很重要... 现在终于明白了读书的技巧,书读 ...
- js类、原型——学习笔记
js 内置有很多类,我们用的,都是从这些类实例化出来的. function Object () {} function Array () {} function String () {} functi ...
- 《JS高程》引用类型学习笔记
2月圆满的结束了,结束之前是如凤凰般的涅槃.一边上班,一边搞科研的忙碌有点让人透不过气,心会不由得浮躁起来.但是,无论什么事情,只要充满耐心.专心去做,总会朝好的方向发展,心态真的很重要.Anyway ...
- 《Node.js核心技术教程》学习笔记
<Node.js核心技术教程>TOC \o "1-3" \h \z \u 1.章模块化编程 2019.2.19 13:30' PAGEREF _101 \h 1 08D ...
- JavaScript原型学习笔记
1 理解JavaScript原型 什么是原型? 原型是一个对象,其他对象可以通过它实现属性继承. 任何一个对象都可以成为原型么? 是 哪些对象有原型 所有的对象在默认的情况下都有一个原型,因为原型本身 ...
- C++中临时对象的学习笔记
http://www.cppblog.com/besterChen/category/9573.html 所属分类: C/C++/STL/boost 在函数调用的时候,无论是参数为对象还是返回一个对 ...
- 关于js的对象原型继承(一)
javascript中,对象的继承是通过原型去继承. 可以这样理解:js中的对象,包含的除了属性和方法,还有一个最基本的原型__proto__对象.这个原型__proto__指向谁,这个对象就继承谁. ...
- 深度剖析前端JavaScript中的原型(JS的对象原型)
这张图片有点劝退了,哈哈哈~ 通过原型机制,JavaScript 中的对象从其他对象继承功能特性:这种继承机制与经典的面向对象编程语言的继承机制不同.本文将探讨这些差别,解释原型链如 ...
随机推荐
- 解决Putty连接不上服务器的方法
1.vi /etc/ssh/sshd_config 将PermitRootLogin的注释取消,或者将no改为yes. 2.service sshd restart 3.setup命令进入将防火墙关闭 ...
- PHP+socket游戏数据统计平台发包接包类库
<?php /** * @title: PHP+socket游戏数据统计平台发包接包类库 * @version: 1.0 * @author: perry <perry@1kyou.com ...
- 谷歌官方SwipeRefreshLayout下拉刷新的用法。
<Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新> 下拉刷新在如今移动开发中应用如此广泛和普遍,以至于谷歌干脆在SDK中给予支持.在android-su ...
- Code First Migrations更新数据库结构的具体步骤
一.打开程序包管理器控制台 当你的实体模型与数据库架构不一致时,引发以下错误:The model backingthe 'SchoolContext' context has changed sinc ...
- 精华 ionic入门之色彩、图标、边距和界面组件:列表
目录:色彩.图标和边距色彩图标内边距界面组件:列表列表:.list成员容器:.item.item: 嵌入文本.item : 嵌入图标.item : 嵌入头像.item : 嵌入缩略图.item : 嵌 ...
- lucene 过滤结果
package cn.itcast.h_filter; import java.util.ArrayList; import java.util.List; import org.apache.luc ...
- Linux的三种特殊权限
1.Suid Set位权限 ●对文件以文件的拥有者身份执行文件 ●对目录无影响 权限设置: ●suid=u+s 2.Sgid Set位权限 ●对文件以文件的组身份执行文件 ●对目录在目录中最新创建的文 ...
- 分布式一致性原理—BASE
定义 BASE是BasicallyAvailable(基本可用).Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写,是由来自eBay的架构师Dan ...
- IBInspectable / IBDesignable
无论陈词滥调多少次,比起一个需要我们记住并且输入什么的界面来说,如果替换成我们能够看见并可控制的界面的话将会是巨大的进步. Xcode 6 提供了这样一个替代,在旧技术上建立新的互动.在设计项目的时候 ...
- vi编辑器选项
Vi编辑器有一些选项设置可以帮助人们更好的使用. 在vi中选项分为两种: 1. 开关选项,如果要打开这类选项就使用ex命令——:set 选项:如果要关闭这类选项就是用ex命令——:set no选项 ...