js 原型链详细解析完整版

WinForm开发基础之操作注册表 在Windows操作系统中,注册表是一个存储配置信息和设置的重要数据库。它包含了系统和应用程序的配置信息,例如程序的安装路径、用户的个性化设置等适用场景。在WinForm应用程序中,注册表的操作通常用于保存应用程序的配置,如用户设置、窗口位置等。本文将介绍如何在WinForm中进行注册表操作,包括如何读取、写入、删除注册表项以及创建和删除键值。在WinForm应用程序中操作注册表是一个非常常见的需求,可以用于存储配置信息、程序设置等。通过类,开发者可以轻松地读取、写入、删除注册表键值。 阅读详情

作者:Yi罐可乐
链接:https://www.jianshu.com/p/dee9f8b14771

##一. 普通对象与函数对象
JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object 、Function 是 JS 自带的函数对象。下面举例说明

var o1 = {}; 
var o2 =new Object();
var o3 = new f1();

function f1(){}; 
var f2 = function(){};
var f3 = new Function('str','console.log(str)');

console.log(typeof Object); //function 
console.log(typeof Function); //function  

console.log(typeof f1); //function 
console.log(typeof f2); //function 
console.log(typeof f3); //function   

console.log(typeof o1); //object 
console.log(typeof o2); //object 
console.log(typeof o3); //object

在上面的例子中 o1 o2 o3 为普通对象,f1 f2 f3 为函数对象。怎么区分,其实很简单,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。f1,f2,归根结底都是通过 new Function()的方式进行创建的。Function Object 也都是通过 New Function()创建的

二. 构造函数

我们先复习一下构造函数的知识:

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('Zaxlct', 28, 'Software Engineer');
var person2 = new Person('Mick', 23, 'Doctor');

上面的例子中 person1 和 person2 都是 Person 的实例。这两个实例都有一个 c o n s t r u c t o r \color{blue}{constructor } constructor(构造函数)属性,该属性(是一个指针)指向 Person。 即:

  console.log(person1.constructor == Person); //true
  console.log(person2.constructor == Person); //true

我们要记住两个概念(构造函数,实例):
p e r s o n 1 和 p e r s o n 2 都 是 构 造 函 数 P e r s o n 的 实 例 一 个 公 式 : 实 例 的 构 造 函 数 属 性 ( c o n s t r u c t o r ) 指 向 构 造 函 数 。 \color{blue}{person1 和 person2 都是 构造函数 Person 的实例 一个公式: 实例的构造函数属性(constructor)指向构造函数。} person1和person2都是构造函数Person的实例一个公式:实例的构造函数属性(constructor)指向构造函数。
##三. 原型对象
在 JavaScript 中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象。先用不管什么是**proto** 第二节的课程会详细的剖析

function Person() {}
Person.prototype.name = 'Zaxlct';
Person.prototype.age  = 28;
Person.prototype.job  = 'Software Engineer';
Person.prototype.sayName = function() {
  alert(this.name);
}
  
var person1 = new Person();
person1.sayName(); // 'Zaxlct'

var person2 = new Person();
person2.sayName(); // 'Zaxlct'

console.log(person1.sayName == person2.sayName); //true

我们得到了本文第一个「定律」:
每个对象都有**proto** 属性,但只有函数对象才有 prototype 属性

那什么是原型对象呢?
我们把上面的例子改一改你就会明白了:

Person.prototype = {
   name:  'Zaxlct',
   age: 28,
   job: 'Software Engineer',
   sayName: function() {
     alert(this.name);
   }
}

原型对象,顾名思义,它就是一个普通对象(废话 = =!)。从现在开始你要牢牢记住原型对象就是 Person.prototype ,如果你还是害怕它,那就把它想想成一个字母 A : v a r A = P e r s o n . p r o t o t y p e \color{blue}{A: var A = Person.prototype} A:varA=Person.prototype

在上面我们给 A 添加了 四个属性:name、age、job、sayName。其实它还有一个默认的属性:constructor`

在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)

上面这句话有点拗口,我们「翻译」一下:A 有一个默认的 constructor 属性,这个属性是一个指针,指向 Person。即:

	Person.prototype.constructor == Person

这两个「公式」好像有点联系:

person1.constructor == Person
Person.prototype.constructor == Person

person1 为什么有 constructor 属性?那是因为 person1 是 Person 的实例。
那 Person.prototype 为什么有 constructor 属性??同理, Person.prototype (你把它想象成 A) 也是Person 的实例。
也就是在 Person 创建的时候,创建了一个它的实例对象并赋值给它的 prototype,基本过程如下:
结论:原型对象(Person.prototype)是 构造函数(Person)的一个实例。


原型对象其实就是普通对象(但 Function.prototype 除外,它是函数对象,但它很特殊,他没有prototype属性(前面说道函数对象都有prototype属性))。看下面的例子:

function Person(){};
 console.log(Person.prototype) //Person{}
 console.log(typeof Person.prototype) //Object
 console.log(typeof Function.prototype) // Function,这个特殊
 console.log(typeof Object.prototype) // Object
 console.log(typeof Function.prototype.prototype) //undefined

Function.prototype 为什么是函数对象呢?

var A = new Function ();
 Function.prototype = A;

上文提到凡是通过 new Function( ) 产生的对象都是函数对象。因为 A 是函数对象,所以Function.prototype 是函数对象。

那原型对象是用来做什么的呢?主要作用是用于继承。举个例子:

var Person = function(name){
    this.name = name; // tip: 当函数执行时这个 this 指的是谁?
  };
  Person.prototype.getName = function(){
    return this.name;  // tip: 当函数执行时这个 this 指的是谁?
  }
  var person1 = new person('Mick');
  person1.getName(); //Mick

从这个例子可以看出,通过给 Person.prototype 设置了一个函数对象的属性,那有 Person 的实例(person1)出来的普通对象就继承了这个属性。具体是怎么实现的继承,就要讲到下面的原型链了。

小问题,上面两个 this 都指向谁?

	 var person1 = new person('Mick');
	  person1.name = 'Mick'; // 此时 person1 已经有 name 这个属性了
	  person1.getName(); //Mick  

故两次 this 在函数执行时都指向 person1。


这里写图片描述
《JavaScript 高级程序设计》的图 6-1

总结 1

Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;

总结 2
普通对象的**proto指向这个对象(this)的构造函数的prototype;
函数对象的
proto**全部都是指向Function的prototype。

windows注册表操作 注册表记录了用户安装在计算机上的软件和每个程序的相互关联信息,它包括了计算机的硬件配置,包括自动配置的即插即用的设备和已有的各种设备说明、状态属性以及各种状态信息和数据。此根键中保存的是默认用户(default),当前登录用户和软件(software) 的信息,其中DEFAULT子项是其中最重要的,它的配置是针对未来将会被创建的新用户的。Schemes:按事件分类列表。该根键包括启动应用程序所需的全部信息,包括扩展名,应用程序与文档之间的关系,驱动程序名,DDE和OLE信息,类ID。之相对应的应用程序。 阅读详情

相关推荐

【C#_注册表操作】

注册表在软件开发中可以存储一些关键信息,这样就不会轻易被删除的,作用比较多,比如可以用它来做授权相关事宜等.

胡说八道,欢迎来此交流霸道心得 1329

原型与原型链详解(带图方便理解)

每一个类(构造函数)都有一个显示原型prototype(本质就是个对象)01 类:是创建对象实例的模板 本质上讲类是个函数 (例如Array object String )001 构造函数 :用new来执行的函数02 实例:就是由类创建的对象 本质上就是对象例如 [1,2,3] {name : "mumu " } , “abc”以上就是面试经常会问到的内容啦,希望对你们有用哈。

m0_55734030的博客 1万+

MFC对注册表的操作

今天刚学了对注册表的读写操作。在这里总结一下。 主要用到的函数有: LONG WINAPI RegCreateKey( //Creates the specified registry key. If the key already exists in the registry, the function opens it. __in HKEY hKey, //创建一个指定

linshaolie 7593

js原型与原型链详解(万文总结,一文搞懂原型链!)

JavaScript中的原型和原型链:1,每个对象均存在隐式原型(__proto__),函数对象才有prototype属性2,__proto__存在的意义在于为原型链查找提供方向,原型链查找靠的是__proto__,而不是prototype3,函数对象的__proto__都指向Function.prototype4,每个对象都有一个隐式原型属性(__proto__),多个原型通过__proto__链接在一起形成的链式结构就是原型链😃。

Yi_qian的博客 3万+

winreg Python也能操作注册表

前言 注册表这个东西大家可能都不是很熟悉,因为我们平时用到的少;但是它是Windows的核心,很多软件的启动和日志记录什么的都包含在里面,可以说它是一个大型的数据库也不为过,今天我们就来看看Python是如何操作注册表的吧。 一、注册表初次见面 进入系统注册表的方法多种多样,最常见的就是运行窗口输入命令“regedit”,即可进入注册表: 注册表中的几个菜单分别对应机器的根目录登陆的用户信息和本地机器信息以及用户信息和本地配置信息等。 二、认识操作注册表的模块 在Python中就有这

KHOST的博客 1506

C#注册表操作汇总

一、注册表基本知识 1)       结构      键->项->子项->值项(名称、类型、数据)     REG_SZ         字符串     REG_BINARY    二进制     REG_DWORD    双字   2)       组成 1.HKEY_CLASSES_ROOT  定义了系统中所有文件类型标识和基本操作标识    该主键包含文件扩展名和应用程序

奔跑的小河 2179

原型及原型链详解

每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条。这就是所谓的原型链的基本概念。——摘自《javascript高级程序设计》

dyy_csdn的博客 3万+

注册表操作详解

注册表操作

gyuezhang的专栏 2420

js - 原型链

js原型链:原型链以及其应用

ywjyxm的博客 6479

C++中注册表操作

C++接触了一段时间,最近在捣鼓PatrolBot移动机器人小车,在看源码的时候发现有对注册表操作的代码,第一次接触,便来此记录一番。 AREXPORT bool ArUtil::getStringFromRegistry(REGKEY root, const char *key, const char *value, char *str,

lina_suda的博客 2757

C#实现操作注册表的方法

注册表是Windows操作系统中用于存储系统和应用程序的设置信息的数据库。本文将介绍C#操作注册表的方法,主要结合示例代码形式对读取、创建、修改、删除注册表的信息,为有需要的朋友提供参考。C#提供的Microsoft.Win32命名空间包含了许多注册表相关的类,其中Registry和RegistryKey二类可以满足我们的一些操作。提供注册表中的根项的对象,是一个静态类,提供访问项值对的相关方法。修改注册表中的信息直接使用 SetValue 方法来实现。是注册表封装,提供注册表中的项级节点。

dotNet开发技术分享 1336

超详细JS原型链(建议收藏)

JS原型链

weixin_48675760的博客 5567

C#操作注册表

以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中判断名称为name注册表项是否存在,这一方法在删除注册表时已经存在,在新建一注册表项时也应有相应判断;以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下新建XXX目录并在此目录下创建名称为name值为tovalue的注册表项;以上是读取的注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下的XXX目录中名称为name的注册表值;3.删除注册表中指定的注册表项。

biyusr的专栏 774

Windows驱动开发之注册表操作

内核驱动开发之注册表操作

enjoy5512的博客 5384

内核操作注册表

实现效果 注册表的查询,,可以查询到驱动的路径,把驱动拷贝到系统目录C:\Windows\System32\drivers,并且把驱动路径改为 C:\Windows\System32\drivers 知识点: 1、驱动文件在注册表中的路径 用 类似 “\SystemRoot\system32\drivers\afd.sys”这样的格式,比用 “??\C:\Windows\System32\drivers\MyDriver2.sys” 这种格式能满足你跟早的启动的需求 2、Start 值 越小启动越早,3是手

lygl35的博客 717

怎么利用Python读取操作注册表

vb读写注册表源代码 bas文件 可以直接引用

nnn0245的博客 1796

操作注册表

有些程序需要随系统启动,或者需要建立某些文件关联等问题,这些都是通过在安装程序中对注册表进行操作的结果。Inno Setup中通过[registry]段实现对注册表的操作。 本段说明: 参数列表: 参数 说明 Root 根键。必须是下列中的一个: HKCR (HKEY_CLASSES_ROOT) HKCU (HKEY_CURR

持之以恒,不需要特别的关注,成为持续不间断的坚持 456

MFC的注册表操作—CRegKey类的使用

本人在开发IE主页修改器时,想通过MFC中的函数操作注册表来实现功能,因此在开发前整理了本篇文章。1.简介CRegKey提供了对系统注册表的操作方法,通过CRegKey类,可以方便的打开注册表的某个分支或子键(CRegKey::Open),可以方便的修改一个键的键值(CRegKey::SetValue),也可以查询某个键的键值(CRegKey::QueryValue),操作完成之后,可

6387
上一篇: js forEach map reduce filter 详解
下一篇: promise详解
wen_binObject
博客等级 码龄10年 51粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值