原创作品,转载请注明来源,sogeisetsu,我的csdn上也有这篇文章csdn

js属性,封装性,prototype综合解析

用实例来解释以下js的公有属性,静态属性,实例属性,prototype和封装性

下面是我在写博客的源代码,您可以先不要看他,先看下面的文字部分

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js属性</title>
<script>
//先构造一个函数
//先搞清楚原型链
function qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};
let age="12";//这是私有属性
//这是私有方法
function go() {
console.log("have gone");
}
}
//先创建一个实例对象
let shili=new qust();
//构造函数的原型对象通过prototype来调用
console.log(qust.prototype);//打印原型对象,打印结果是object
//注意,这个时候还没有改变原型对象
console.log(qust.prototype.constructor);//打印原型对象的constructor
/*打印结果是如下
ƒ qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};

* */
console.log(qust);//打印构造函数
/*结果如下
* ƒ qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};
…*/
console.log(qust === qust.prototype.constructor);//true,原型对象的constructor指向构造函数
//但是,如果我们修改了qust.prototype(原型对象),qust.prototype.constructor还指向构造函数吗?
qust.prototype={//prototype保存一些构造函数共有的属性,来节省内存
type:"人类",
typerun:function () {
console.log('人类');
}
};
console.log(qust === qust.prototype.constructor);//false,不相等了。
// 注意点: 为了不破坏原有的关系, 在给prototype赋值的时候, 需要在自定义的对象中手动的添加constructor属性, 手动的指定需要指向谁
qust.prototype={//prototype保存一些构造函数共有的属性,来节省内存
constructor:qust,//不带括号
setype:"人类",
typerun:function () {
console.log('人类');
}
};
console.log(qust === qust.prototype.constructor);//true
/*
1.对象中__proto__组成的链条我们称之为原型链
2.对象在查找属性和方法的时候, 会先在当前对象查找
如果当前对象中找不到想要的, 会依次去上一级原型对象中查找
如果找到Object原型对象都没有找到, 就会报错
*/
// 放个图就明白了
let shi=new qust();//由于修改了一些东西,所以新创建一个对象
console.log(shi.setype);//打印在原型对象中定义的值,结果是人类
shi.setype="新人类";
console.log(shi.setype);//新人类
console.log(shi.__proto__);/*{setype: "人类", constructor: ƒ, typerun: ƒ}*/
console.log(shi.__proto__.setype);//人类
console.log(qust.prototype.setype);//人类
console.log(shi.__proto__===qust.prototype);//true
// 注意点: 在给一个对象不存在的属性设置值的时候, 不会去原型对象中查找, 如果当前对象没有就会给当前对象新增一个不存在的属性
/*
1.在JavaScript中属性和方法分类两类
1.1实例属性/实例方法
在企业开发中通过实例对象访问的属性, 我们就称之为实例属性
在企业开发中通过实例对象调用的方法, 我们就称之为实例方法
1.2静态属性/静态方法
在企业开发中通过构造函数访问的属性, 我们就称之为静态属性
在企业开发中通过构造函数调用的方法, 我们就称之为静态方法
*/
//先看一下原先设置的qust
/*function qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};
let age="12";//这是私有属性
//这是私有方法
function go() {
console.log("have gone");
}
}
* */
//上面的属性或方法都是通过创建实例对象才能访问或调用,所以我们叫他实例属性或实例方法
qust.school="qust";//这是一个静态属性,通过构造函数来访问
console.log(qust.school);//qust
//定义一个方法
qust.getschool=function () {
console.log("qust is my school");
}//这是通过构造函数访问的方法,我们称其为静态方法
qust.getschool()//调用静态方法
//qust is my school
//封装性
//防止混乱构造一个新函数newqust
function newqust() {
this.name="university";//这是公有属性
this.age=12;
//以下是修改内容
let myage=19;//设置一个私有年龄,这是在函数外面无法修改的
this.setnewage=function (newage) {
if(newage>=0){
myage=newage;
}
};
//我们还需要一个来调用年龄
this.getage=function () {
return myage;
};
//这是共有方法
this.run=function () {
console.log("have ran");
};
let age="12";//这是私有属性,只能在该函数里访问,在外无法访问,这就为我们的封装性提供了可能
//这是私有方法
function go() {
console.log("have gone");
}
}
//试一下调用私有属性
console.log(newqust.age);//undefined
/*
* 假设一个场景,让用户设置自己的年龄,年龄吗肯定大于零的,但是通过公有属性却而已随意设置*/
let newshili=new newqust();
newshili.age=-2;
console.log(newshili.age);//-2,这是荒诞的
//所以需要修改
newshili.setnewage(15);
console.log(newshili.getage());//15 </script>
</head>
<body> </body>
</html>

先搞清楚原型链,prototype

先构造一个函数

function qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};
let age="12";//这是私有属性
//这是私有方法
function go() {
console.log("have gone");
}
}

先创建一个实例对象来调用构造函数中的属性

 let shili=new qust();

构造函数的原型对象通过prototype来调用

console.log(qust.prototype);//打印原型对象,打印结果是object

注意,这个时候还没有改变原型对象

console.log(qust.prototype.constructor);//打印原型对象的constructor

qust.prototype.constructor是指向构造函数qust的。


所以

js静态属性,实例属性,封装性,prototype,__proto__综合解析的更多相关文章

  1. Python中类的声明,使用,属性,实例属性,计算属性及继承,重写

    Python中的类的定义以及使用: 类的定义: 定义类 在Python中,类的定义使用class关键字来实现 语法如下: class className: "类的注释" 类的实体 ...

  2. Vue.js Cookbook: 添加实例属性; 👍 axios(4万➕✨)访问API; filters过滤器;

    add instance properties //加上$,防止和已经定义的data,method, computed的名字重复,导致被覆写.//可以自定义添加其他符号. Vue.prototype. ...

  3. python 类中的公有属性 私有属性 实例属性

    class parent(): i=1 __j=2 class child(parent): m=3 __n=4 def __init__(self,age,name): self.age=age s ...

  4. js实例属性和原型属性

    <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <t ...

  5. 17 webpack中babel的配置——静态属性与实例属性

    // class关键字,是ES6中提供的新语法,是用来实现ES6中面向对象编程的方式 class Person{ // 使用static关键字,可以定义静态属性 // 所谓的静态属性,就是可以直接通过 ...

  6. Python之路-面向对象&继承和多态&类属性和实例属性&类方法和静态方法

    一.面向对象 编程方式 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强…” 什么是面 ...

  7. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  8. Python中的类属性、实例属性与类方法、静态方法

    1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...

  9. Python类属性与实例属性理解

    按理讲,类属性改变,类的实例对象这个属性也应该被改变,但是在python中实际却不是这样 class test(): name = 111 a = test() b = test() a.name = ...

随机推荐

  1. Tomcat 报错 The APR based Apache Tomcat Native library which allows optimal performance in production environmen

    这个问题在我一次重新装了tomcat和myeclipse时出现 说实话 出现这个问题头大 但是好在解决了 美滋滋 最开始到处寻找各种解决方案 最后直接注释了server.xml中的一行 直接解决这个报 ...

  2. 【Django】ESRTful APi

    如何利用rest framework搭建Django API框架!   环境:win10 python3.6 思路步骤: 创建一个可以序列化的类 去数据库取数据交给序列化的类处理 把序列化的数据返回前 ...

  3. <<构建之法第三版>>读书遇到的5个问题

    1.书中第4章4.5节所说的结对编程让我感觉有一点困惑,书中书写的是结对编程,说实话我是第一次接触这个词汇,我能感到这种方式的新特之处,但是对比我现实的编程经历,我很难想象在一般的企业开发中这样的行为 ...

  4. maven 项目报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)解决

    idea在使用maven构建的项目中使用mybatis时报错org.apache.ibatis.binding.BindingException: Invalid bound statement (n ...

  5. ThinkPHP框架快速开发网站

    使用ThinkPHP框架快速搭建网站 这一周一直忙于做实验室的网站,基本功能算是完成了.比较有收获的是大概了解了ThinkPHP框架.写一些东西留作纪念吧.如果对于同样是Web方面新手的你有一丝丝帮助 ...

  6. python selenium模拟登陆qq空间

    不多说.直接上代码 from selenium import webdriver driver = webdriver.Chrome() driver.get('http://qzone.qq.com ...

  7. Spring入门之AOP实践:@Aspect + @Pointcut + @Before / @Around / @After

    零.准备知识 1)AOP相关概念:Aspect.Advice.Join point.Pointcut.Weaving.Target等. ref: https://www.cnblogs.com/zha ...

  8. Laravel Entrust 权限管理扩展包的使用笔记

    简介 Entrust 是一个简洁而灵活的基于角色进行权限管理的 Laravel 扩展包.针对 Laravel 5,官方推荐的安装版本是 5.2.x-dev.它的详细使用方法请查看 Entrust Gi ...

  9. spring和springmvc的基础知识点

    1.spring中使用@Service("userservice")如何在其他地方引用这个service? (1)getBean("userservice") ...

  10. Java后端工程师必备书单(从Java基础到分布式)

    Java开发工程师一般负责后端开发,当然也有专门做Java Web的工程师,但是随着前后端的分离,越来越多的Java工程师需要往大后端方向发展. 今天我们就来介绍一下Java后端开发者的书单. 首先要 ...