js-静态、原型、实例属性
本篇来说一下js中的属性:
1、静态属性
2、原型属性
3、实例属性
静态属性:
- function klass(){}
- var obj=new klass();
- klass.count=0;
- klass.count++;
- console.log(obj.count);//undefined
- console.log(klass.count);//1
静态属性存在于对象中。它的访问方式只有:类名.count 一种方式,无法通过实例访问。
如:Math.PI
原型属性:
在讲解原型属性之前有必要先提一下new操作符:
①:var obj=klass()和②:var obj=new klass()的结果显然是不同的。
①的操作仅仅是简单的调用klass函数,然后把klass函数的返回值赋给obj变量。
②所做的操作是:调用构造函数klass,创建一个包含prototype内部指针的新对象obj。
直观看来:使用new操作符是创建该类的实例对象,而不使用new操作符则是直接调用函数。
好了,下面继续看原型属性:
原型属性又称公共属性,它不属于某个类的实例,而是直接属于某个类。
- function klass(){}
- var obj=new klass();
- klass.prototype.count=0;
- klass.prototype.count++;
- console.log(klass.prototype.count);//1
- console.log(obj.count);//1
原型属性存在类的原型之中。它的访问方式有两种:
1、类名.prototype.count
2、实例对象.count
第二种访问方式的原理是:
首先在实例对象中查找,如果找到则立即返回,否则在原型(原型链)中查找(因为new操作符创建的对象包含了一个prototype的内部指针,所以可以向上追溯,查找属性),找到则返回相应的值,否则返回undefined。
所以obj.count的方式实际操作的是klass.prototype.count属性。
再看下面的例子:
- function klass(){}
- var obj=new klass();
- klass.prototype.count=0;
- klass.prototype.count++;
- obj.count++;
- console.log(klass.prototype.count);//1
- console.log(obj.count);//2
与上面不同的是仅仅加了一句obj.count++;按照属性查找的原理,obj中并不存在count属性,所以他会在原型链中查找count属性,返回klass.prototype.count。
obj.count++即可拆分为更加直观的:obj.count=klass.prototype.count+1;可以看出这一句话是简单的赋值也是属性定义:
首先给obj定义了一个实例属性count,再将klass.prototype.count+1的结果赋值给obj.count。
所以klass.prototype.count的结果为1,obj.count的结果是2。
以上便是要讲解的第三者属性:实例属性。
实例属性是公开的(public),可以通过类的实例(或this.)直接访问和修改它。也就是归属实例所有。
明白了相应的概念,我们再来讲一下他们各自的使用场合,看下面的例子:
- function klass(id){
- this.id=id;
- }
- klass.Uid=1;
- klass.prototype.names=[];
- var obj1=new klass("obj1");
- var obj2=new klass("obj2");
- obj1.names.push(obj1.id);
- klass.Uid++;
- obj1.names.push(obj2.id);
- klass.Uid++;
- console.log(obj1.id);//obj1
- console.log(obj2.id);//obj2
- console.log(klass.prototype.names);//obj1 , obj2
- console.log(klass.Uid);//3
他们的应用场合显而易见,静态属性是全局的,原型属性是实例公有的,实例属性是各个实例所独有的。
js的属性篇基本就到此结束,有疑问或错误之处欢迎指出,请大家多多赐教。
js-静态、原型、实例属性的更多相关文章
- JS入门系列(2)-原型-实例属性
下面的例子中,在构造器内部定义了like,然后再原型上也定义了like.通过下面的测试表明: 在构造器内部创建的实例方法会阻挡原型上定义的同名方法 初始化操作的优先级如下: 首先,通过原型给对象实例添 ...
- Vue.js Cookbook: 添加实例属性; 👍 axios(4万➕✨)访问API; filters过滤器;
add instance properties //加上$,防止和已经定义的data,method, computed的名字重复,导致被覆写.//可以自定义添加其他符号. Vue.prototype. ...
- js静态属性,实例属性,封装性,prototype,__proto__综合解析
原创作品,转载请注明来源,sogeisetsu,我的csdn上也有这篇文章csdn js静态属性,实例属性,封装性,prototype,__proto__综合解析 下面是我在写博客的源代码,您可以先不 ...
- JS Foo.getName笔试题解析,杂谈静态属性与实例属性,变量提升,this指向,new一个函数的过程
壹 ❀ 引 Foo.getName算是一道比较老的面试题了,大致百度了一下在17年就有相关文章在介绍它,遗憾的是我在19年才遇到,比较奇妙的是现在仍有公司会使用这道题.相关解析网上是有的,这里我站在 ...
- JS中的实例方法、静态方法、实例属性、静态属性
一.静态方法与实例方法的例子: 我们先来看一个例子来看一下JS中的静态方法和实例方法到底是什么? 静态方法: function A(){} A.col='red' //静态属性 A.sayMeS=f ...
- js实例属性和原型属性
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态)
js静态私有变量(将方法变成原型模式,被所有实例共享,而方法操作变量,故变量是静态) 一.总结 1.js函数中的private和public:js函数中的私有变量 var 变量名,公有变量 this. ...
- js判断对象的属性是原型的还是实例的
一些情况下,我们需要知道对象的属性是原型的还是实例的,如果看代码的话比较繁琐,下面讲解下如何可以直接判断 1.hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的 ...
- JS 之原型,实例,构造函数之间的关系
JS是面向对象的语言,函数也是对象.下面大致介绍下实例,原型与构造函数之间的关系. 构造函数模式 function Person(name,age){ this.name = name; this.a ...
随机推荐
- Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- HTML kbd键盘元素
1. 说明 kbd :即Keyboard Input Element(键盘输入元素).表示键盘按键的语义元素,常用于网页上对快捷键.按键说明的场景. 样式规格:内联样式. 为了在页面上突出显示,可以给 ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- mybatis plugins实现项目【全局】读写分离
在之前的文章中讲述过数据库主从同步和通过注解来为部分方法切换数据源实现读写分离 注解实现读写分离: http://www.cnblogs.com/xiaochangwei/p/4961807.html ...
- inline-block元素间距问题的几种解决方案
不知道大家有没有碰到过设置了display:inline-block;的几个相邻元素之间有几px间距的问题,这里提供几种简单实用的解决方法,希望能够帮到大家! 方法1. 将<li>标签 ...
- RMS去除在线认证
在微软 OS 平台创建打开 RMS 文档如何避免时延 相信我们在企业内部的环境中已经部署了微软最新的OS平台,Windows 7和Windows 2008 R2,在这些OS平台上使用IRM功能时,您有 ...
- 用C++实现Linux中shell的ls功能
实现输出当前目录下的文件名 ls功能: 方法一: #include <iostream> #include <algorithm> #include <stdio.h&g ...
- “前.NET Core时代”如何实现跨平台代码重用 ——源文件重用
微软在2002年推出了第一个版本的 .NET Framework,这是一个主要面向Windows 桌面(Windows Forms)和服务器(ASP.NET Web Forms)的基础框架.在此之后, ...
- Hadoop4 利用VMware搭建自己的hadoop集群
前言: 前段时间自己学习如何部署伪分布式模式的hadoop环境,之前由于工作比较忙,学习的进度停滞了一段时间,所以今天抽出时间把最近学习的成果和大家分享一下. 本文要介绍的是如 ...
- 用Go实现的简易TCP通信框架
接触到GO之后,GO的网络支持非常令人喜欢.GO实现了在语法层面上可以保持同步语义,但是却又没有牺牲太多性能,底层一样使用了IO路径复用,比如在LINUX下用了EPOLL,在WINDOWS下用了IOC ...